CUDA에서 실행되는 빔 포밍 프로그램이 있고 Opengl에서 빔의 출력을 표시해야합니다. 24x12 작은 사각형 배열로 구성된 Opengl에서 사각형을 그려야합니다. 빔 포밍을 수행하는 CUDA 프로그램의 출력에 따라 다른 색상. 다음 구조를 사용하여 정사각형의 정점과 각 정점의 색상을 포함하는 배열을 전달하는 VBO를 사용하여 reactangle을 그릴 수있었습니다. 내가 직면 한 문제의 전반적인 요약은 각 사각형에 색상을 올바르게 할당 할 수 없다는 것입니다. 코드에서 일부 발췌 :
struct attributes {
GLfloat coords[2]; //co-ordinates of the vertices
GLfloat color[3]; //color of the vertices
};
glGenBuffers(1, &vbo_romanis); // vbo_romanis is the VBO for drawing the frame
glBindBuffer(GL_ARRAY_BUFFER, vbo_romanis);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STREAM_DRAW);
glShadeModel (GL_SMOOTH);
glUseProgram(program);
glEnableVertexAttribArray(attribute_coord);
glEnableVertexAttribArray(attribute_color);
glBindBuffer(GL_ARRAY_BUFFER, vbo_romanis);
glVertexAttribPointer(
attribute_coord2d, // attribute
2, // number of elements per vertex, here (x,y)
GL_FLOAT, // the type of each element
GL_FALSE, // take our values as-is
sizeof(struct attributes), // next coord2 appears every 5 floats
0 // offset of first element
);
glVertexAttribPointer(
attribute_color, // attribute
3, // number of elements per vertex, here (r,g,b)
GL_FLOAT, // the type of each element
GL_FALSE, // take our values as-is
sizeof(struct attributes), // stride
(GLvoid*) offsetof(struct attributes, color) // offset
);
/* Push each element in buffer_vertices to the vertex shader */
glDrawArrays(GL_QUADS, 0, 4*NUM_SQRS);
그래서 배열을 그릴 때 두 가지 문제에 직면하고 있습니다.
내가 원하는대로 나타나지 않는 색상. 내가 Opengl에 대해 읽은 바에 따르면 일단 할당 된 정점의 색상은 변경할 수 없습니다. 그러나 모든 사각형이 정점을 공유하기 때문에 색상이 엉망이 될 수 있습니다. 모든 정점에 같은 색을 주면 잘 작동하지만 다른 색의 모든 사각형을 그리고 싶을 때는 그렇지 않습니다. 그래서 누군가가 정말로 도움이 될 각 사각형에 다른 색상을 할당하는 방법을 지적 할 수 있다면.
각 프레임의 정점 색상을 어떻게 업데이트합니까? 전체 프레임을 다시 그려야합니까 아니면 정점의 색상 만 업데이트 할 수있는 방법이 있습니까?
저는 OpenGL 프로그래밍에 완전히 익숙하지 않으며 어떤 도움을 주시면 감사하겠습니다.
정점 데이터가 실제로 무엇인지는 명확하지 않지만 다음과 같습니다.
그러나 모든 사각형이 정점을 공유하기 때문에 색상이 엉망이 될 수 있습니다.
두 개의 인접한 정사각형에 대해 다음 데이터를 사용하려고한다는 것을 의미합니다 (AF가 정점 임).
A---B---C
| | |
| | |
D---E---F
그러나 OpenGL에서 정점은 위치뿐만 아니라 모든 속성 의 집합입니다 . 여기서 얻은 것은 색상이 사각형 사이에 매끄럽게 보간된다는 것입니다. 따라서 기술적으로 B1, E1은 lieft 사각형의 색상이고 B2, E2는 오른쪽 사각형의 색상이지만 동일한 좌표를 사용하여 정점 B와 E를 B1 / B2 및 E1 / E2로 복제해야합니다.
그러나 문제에 대해 flat shading
vaertex 셰이더 출력을 flat
. 버텍스 셰이더 출력 (가변)은 기본적으로 전체 프리미티브에 걸쳐 보간됩니다. 그러나이를 다음과 같이 정의 flat
하면 보간이 방지됩니다. 대신 한 정점 의 값 이 전체 기본 요소에 사용됩니다. OpenGL은 도발하는 정점 의 conecpt를 사용하여 이러한 flat
출력 의 값을 정의하는 기본 요소의 정점 을 정의 합니다.
이 명령 glProvokingVertex()
은 정점을 선택할 일반 규칙을 지정하는 데 사용할 수 있으며 첫 번째와 마지막 사이에서 선택할 수 있습니다. 정점 데이터를 교묘하게 구성하면 정사각형 하나의 삼각형 모두에 대해 공유 할 정점을 얻을 수 있으며, 이는 둘 다에 대한 도발 정점이 될 수 있으므로 한 모서리의 색상만으로 각 "그리드 셀"의 색상을 정의 할 수 있습니다. 셀의 정점이며 정점을 복제 할 필요가 없습니다.
참고로 glShadeModel(GL_SMOOTH);
코드에 명령 이 있습니다. 이것은 더 이상 사용되지 않으며 귀하의 의견에서 알 수 있듯이 프로그래밍 가능한 파이프 라인을 사용할 때 완전히 쓸모가 없습니다. 그러나 개념적으로 이것은 내가 여기서 제안하는 플랫 쉐이딩 접근법과 정반대입니다.
각 프레임의 정점 색상을 어떻게 업데이트합니까? 전체 프레임을 다시 그려야합니까 아니면 정점의 색상 만 업데이트 할 수있는 방법이 있습니까?
OpenGL은 장면 그래프 라이브러리가 아닙니다. 과거에 어떤 개체를 그렸는지 기억하지 못하며 그 속성을 변경할 수 없습니다. OpenGL은 렌더링 API이므로 화면에 다른 것을 표시하려면 다시 그리도록 지정해야합니다. 사각형 자체의 위치를 변경하지 않고 색상을 업데이트 할 계획이라면 두 개의 인터리브되지 않은 VBO를 사용하여 색상을 분할하고 데이터를 배치하는 것이 더 좋습니다. 이렇게하면 한 버퍼에서 정적으로 위치를 가질 수 있고 다른 버퍼에서는 색상 업데이트 만 스트리밍 할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다