2016-10-13 2 views
4

OpenGL 4.5를 사용하여 삼각형을 렌더링하고 싶습니다. 이전 버전의 OpenGL을 사용하지만 OpenGL 4.5 기능을 사용하지 않는 온라인 예제를 많이 보았습니다. 따라서 나는 어떤 코드를 직접 "업그레이드"하려고 시도했다. 이는 이전 작업 코드 :OpenGL 4.5에서 vao와 버퍼를 사용하는 방법

// Triangles to render 
vec3 vertices[2][3] = { { vec3(-0.90f, -0.90f, 1.0f), vec3(0.85f, -0.90f, 1.0f), vec3(-0.90f, 0.85f, 1.0f) }, 
        { vec3(0.90f, -0.85f, 1.0f), vec3(0.90f, 0.90f, 1.0f), vec3(-0.85f, 0.90f, 1.0f) } }; 

//Initialize 
glGenVertexArrays(1, &vaos); 
glBindVertexArray(vaos); 

glGenBuffers(1, &buffers); 
glBindBuffer(GL_ARRAY_BUFFER, buffers); 
glBufferData(GL_ARRAY_BUFFER, sizeof(triangles), triangles, GL_STATIC_DRAW); 

ShaderInfo shaders[] = { 
    { GL_VERTEX_SHADER, "triangles.vert" }, 
    { GL_FRAGMENT_SHADER, "triangles.frag" }, 
    { GL_NONE, NULL } 
}; 
program = LoadShaders(shaders); 
glUseProgram(program); 

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0)); 
glEnableVertexAttribArray(0); 

//Render 
GLint index; 
index = glGetUniformLocation(program, "projectionMatrix"); 
glUniformMatrix3fv(index, 1, true, value_ptr(projectionMatrix)); 
glClear(GL_COLOR_BUFFER_BIT); 
glBindVertexArray(vaos); 
glDrawArrays(GL_TRIANGLES, 0, nvertices); 

그리고 화면에 아무것도 그릴 나타나지 않습니다이 코드에 "업데이트"

// Same triangles 
// Initialize 
glCreateVertexArrays(1, &vaos); 
glEnableVertexArrayAttrib(vaos, 0); 
glVertexArrayAttribFormat(vaos, 0, 3, GL_FLOAT, GL_FALSE, 0); 

glCreateBuffers(1, &buffers); 
glNamedBufferData(buffers, sizeof(triangles), triangles, GL_STATIC_DRAW); 

glVertexArrayAttribBinding(vaos, 0, 0); 
glVertexArrayVertexBuffer(vaos, 0, buffers, 0, 0); 

ShaderInfo shaders[] = { 
    { GL_VERTEX_SHADER, "triangles.vert" }, 
    { GL_FRAGMENT_SHADER, "triangles.frag" }, 
    { GL_NONE, NULL } 
}; 
program = LoadShaders(shaders); 
glUseProgram(program); 

// Same render 

누군가가 내가 뭘 잘못했는지 말해 줄 수 ?

편집 : triangle.frag

#version 450 

in vec4 gl_FragCoord; 
out vec4 fColor; 

void main() 
{ 
    fColor = vec4 (0.0, 0.0, 1.0, 1.0); 
} 

triangle.vert

#version 450 

layout (location = 0) in vec3 vPosition; 

uniform mat3 projectionMatrix; 

void main() 
{ 
    vec3 tmp = projectionMatrix*vPosition; 
    gl_Position = vec4 (tmp, 1.0f); 
} 
+2

, 드라이버가 아직 존재하지 않는다면 이전 구현으로 제한 될 수도 있습니다. 너 뭐하고있어? 셰이더는 일반적인 문제입니다. –

+0

GTX 760과 최신 드라이버가 설치되어 있습니다. OpenGL 확장을로드하기 위해 glew를 사용하고 있으며 ARB_direct_state_access를 사용할 수 있는지 확인합니다. – para

+0

#version 450 대신 #version 430 시도하십시오. GTX 760은 OpenGL 4.3을 지원합니다. http://www.geforce.com/hardware/desktop-gpus/geforce-gtx-760/specifications –

답변

1

범인은 대부분이 라인 :

glVertexArrayVertexBuffer(vaos, 0, buffers, 0, 0); 

마지막 매개 변수는 stride이며, 이는 두 개의 연속 배열 요소 사이의 거리를 의미합니다. 전통적인 glVertexAttribPointer 호출에서, 또한 stride 매개 변수가 있지만, 약간의 의미 차이가 있습니다 : 당신이 count * sizeof(type)을 작성하기위한 glVertexAttribPointer에서 0stride, 이것은 편리한 바로 가기입니다 사용하는 경우

는, 그리고 단단히 포장을 가정합니다 속성 배열.

의 보폭은 0을 의미하기 때문에 그리기 호출의 모든 정점에 대해 매우 동일한 요소를 제공합니다. glVertexArrayVertexBuffer은 정점 속성에 직접 연결되어 있지 않기 때문에 동일한 쇼트 컷을 제공 할 수 없으며 여러 속성은 동일한 버퍼 색인을 참조 할 수 있습니다. (바인딩을 설정하기 전이나 후에 버텍스 포맷을 설정할 수 있기 때문에 인터페이스가 매우 이상합니다. 나중에 계산해야합니다.)

따라서 개념적으로 보폭은 이 아니며의 일부입니다. 속성 형식. 이 형식은 단지 정점에 필요한 모든 것을 설명합니다. 이 변경 사항은 직접 상태 액세스와 관련이 없습니다. 실제로는 ARB_vertex_attrib_binding (코어 4.3 이후의 핵심)으로 도입되었는데, 이는 속성 형식 설명에서 버퍼 바인딩을 분리했습니다. 이슈 (2), (3)이 질문에 매우 관련성이 높은 문서 :

(2) 방법 0의 보폭이 BindVertexBuffer으로 해석된다?

• 해결 : 오류가 발생하지 않으며 주어진 속성의 모든 배열 요소는 버퍼의 동일한 위치에서 가져옵니다.

(3) VertexAttribPointer에서 제로의 보폭은 어떻게 처리됩니까?

해결 : BindVertexBuffer은 attrib 형식에 대한 지식이 없습니다. 이므로 VertexAttribPointer은 스트라이드 자체를 계산해야합니다. 그러나 응용 프로그램에서 0의 보폭을 지정한 다음 VERTEX_ATTRIB_ARRAY_STRIDE을 쿼리하면 0을 반환합니다.따라서 유도 된 보폭 은 BindVertexBuffer으로 전달되어야하며 VertexAttribPointer으로 전달 된 보폭과 별도로 추적해야하므로이 사양에서는 상태 (VERTEX_BINDING_STRIDE)가 도입됩니다. 렌더링은 항상 VERTEX_BINDING_STRIDE을 사용합니다.

API가 인 경우 오해의 소지가있는 상태 쿼리로 이어질 수 있습니다. 예를 들어 :

VertexAttribPointer(0, 3, FLOAT, FALSE, 12, 0); 
    // VERTEX_ATTRIB_ARRAY_STRIDE = 12 
    // VERTEX_BINDING_STRIDE = 12 
    BindVertexBuffer(0, buffer, 0, 16) 
    // now VERTEX_ATTRIB_ARRAY_STRIDE is still 12, but 
    // VERTEX_BINDING_STRIDE = 16. 

는 긴 이야기 간결을 만들기 위하여 : 사용 사례를 들어, 당신이 필요합니다

당신의 OpenGL 버전 4.x를 지원하는 매우 현대적인 그래픽 프로세서가 필요
glVertexArrayVertexBuffer(vaos, 0, buffers, 0, 3*sizeof(GLfloat)); 
관련 문제