2014-10-18 3 views
0

셰이더와 버텍스 배열로 가장 간단한 삼각형을 렌더링하려하지만 버텍스 배열을 그릴 때 아무 것도 나타나지 않습니다. 이것은 코드 (그런데, 그리기 기능 이다 호출되고 난 체크)OpenGL 정점 배열이 보이지 않습니까?

배열 생성 :

glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 

glGenBuffers(1, &vbo); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 

GLfloat verts[] = { 
    0, 0, /*vertex 1*/  1, 0, 0, /*color 1*/ 
    0, 100, /*vertex 2*/ 0, 1, 0, /*color 2*/ 
    100, 0, /*vertex 3*/ 0, 0, 1 /*color 3*/ 
}; 
glBufferData(GL_ARRAY_BUFFER, 5 * sizeof(GLfloat) * 3, verts, GL_STATIC_DRAW); 

glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, sizeof(GLfloat) * 2, GL_FLOAT, false, 0, 0); 
glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, sizeof(GLfloat) * 3, GL_FLOAT, false, 0, 0); 

glBindVertexArray(0); 

어레이 렌더링 :

glBindVertexArray(vao); 
glDrawArrays(GL_TRIANGLES, 0, 3); 
glBindVertexArray(0); 

shader.vert

uniform float u_time; 
uniform mat4 u_projMatrix; 

in vec2 position; 
in vec3 color; 

out vec4 vertColor; 
void main() 
{ 
    gl_Position = u_projMatrix * vec4(position, 0.0, 1.0); 
    vertColor = vec4(color, 1.0); 
} 

shader.frag

uniform float u_time; 

in vec4 vertColor; 
void main() 
{ 
    gl_FragColor = vertColor; 
} 

프로젝션 매트릭스 :

glm::mat4 projection = glm::scale(glm::vec3(2.0/800.0, 2.0/600.0, 1.0)); 

나는 내 프로그램의 전체 코드를 표시하지 않은,하지만이 코드 확실히 잘못 있나요?

답변

1

스트라이드 또는 오프셋을 지정하지 않습니다. 크기는 바이트 수가 아닌 구성 요소의 수입니다.

보폭은 두 속성 모두에 대해 5*sizeof(GLfloat) 인 속성에 대한 다음 데이터 집합을 위해 얼마나 많은 바이트의 OpenGL을 진행해야하는지입니다.

오프셋은 2*sizeof(GLFoat) 인 색에 대해 0 인 위치에 대해 특성의 첫 번째 데이터 집합이있는 곳입니다.

은 그래서 당신의 glVertexAttribPointer 호출해야합니다 :

glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 2, GL_FLOAT, false, 5*sizeof(GLfloat), 0); 
glEnableVertexAttribArray(1); 
glVertexAttribPointer(1, 3, GL_FLOAT, false, 5*sizeof(GLfloat), 2*sizeof(GLfloat)); 
+0

나는'무효 * '하지만 그렇다하더라도 그것을 렌더링하지 않았다 아무것도'2 *를 sizeof (GLfloat)를'캐스팅했다. 내가 아직도 잘못하고있는 건 뭐니? – name

+1

'glVertexAttribPointer()'의 두 번째 인수는 크기가 아니라 구성 요소의 수입니다. –

+0

스트라이드를 지정하지 않으면 openGL에 '0,0'' 1,0'과'0,0'이 표시됩니다. –