2011-08-08 2 views
2

나는 간단한 OpenGL 프로그램을 가지고 있고 버텍스 셰이더에 저장된 인스턴스 배열을 그리려하고있다.OpenGL 인스턴스 배열 그리기

#version 330 core 

uniform mat4 MVP; 

const int VertexCount = 4; 
const vec2 Position[VertexCount] = vec2[](
vec2(-100.0f, -100.0f), 
vec2(-100.0f, 100.0f), 
vec2(100.0f, -100.0f), 
vec2(100.0f, 100.0f)); 

void main() 
{ 
    gl_Position = MVP * vec4(Position[gl_VertexID], 0.0, 1.0); 
} 

조각 쉐이더 :

버텍스 쉐이더 : 나는 렌더링이 다음과 쉐이더를 사용하고

#version 330 core 
#define FRAG_COLOR  0 

layout(location = FRAG_COLOR, index = 0) out vec4 Color; 

void main() 
{ 
    Color = vec4(0, 1, 0, 1); //let it will be green. 
} 

내가 컴파일 내가 정점 배열 객체를 만들 쉐이더를 검증 한 후와 삼각형 스트립처럼 그립니다 :

glUseProgram(programHandle); //handle is checked and valid. 
glBindVertexArray(vao); 
glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, 1); 

도면의 뷰포트는 t로 설정됩니다. 그는 glViewport (0, 0, 800, 600)와 같은 창 크기입니다. 매트릭스가 초기화

glUniformMatrix4fv(handle, 1, GL_FALSE, (GLfloat*)&matrix); //handle is checked and valid 

:

Matrix::CreateOrthographicOffCenter(-200, 200, -200, 200, 1.0f, -1.0f, &matrix); 

... 
void Matrix::CreateOrthographicOffCenter(float left, float right, float bottom, float top, float zNearPlane, float zFarPlane, Matrix* matrix) 
{ 
memset(matrix, 0, sizeof(Matrix)); 
    matrix->M11 = 2.0f/(right - left); 
    matrix->M14 = (-right - left)/(right - left); 
    matrix->M22 = 2.0f/(top - bottom); 
    matrix->M24 = (-top - bottom)/(top - bottom); 
    matrix->M33 = 1.0f/(zFarPlane - zNearPlane); 
    matrix->M34 = (-zNearPlane)/(zFarPlane - zNearPlane); 
    matrix->M44 = 1.0f; 
} 

문제는 내 화면에는 삼각형 스트립을 가지고하지 않습니다 나는 노란 코드와 간단한 직교 행렬 MVP에 전달합니다. 나는 MVP 행렬없이 꼭지점을 그리려고했지만 (gl_Position = vec4 (Position [gl_VertexID], 0.0, 1.0)), 아무 것도 얻지 못했습니다. 문제가있는 곳을 찾는 방법?

+0

'glDrawArrays'에서 (여전히 하나의 인스턴스 만 렌더링하기 때문에) 여전히 작동하지 않으면 인스턴스 문제가 아닙니다. –

답변

4
glBindVertexArray(vao); 
glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, 1); 

그리고 그 VAO에는 정확히 무엇이 저장되어 있습니까? 나는 당신의 대답이 "아무것도 아닐 것"이라고 생각합니다.

그렇다면 몇 가지 문제가 발생합니다. 이것이 호환성 문맥 (또는 GL 2.1 이전) 인 경우, OpenGL 을 사용자가 아무것도 가지고 있지 않은 VAO로 렌더링하는 것을 허용하지 않습니다. 즉, 모든 속성을 비활성화하여 렌더링 할 수 없습니다. GL_INVALID_OPERATION 오류가 발생합니다.

그러나 핵심 컨텍스트 3.2 이상인 경우 이 비활성화 된 VAO로 렌더링됩니다.

물론 OpenGL 사양이 말하는 것입니다. NVIDIA의 드라이버가 말하는 것은 핵심 VAIO와 호환 가능한 VAO로 렌더링 할 수 있다는 것입니다. ATI의 드라이버가 말하는 바는 은 비활성화 된 VAO로 렌더링 할 수 없습니다. 코어 및 호환성.

간단히 말해 코드를 작동 시키려면 뭔가를 바인딩하십시오. 배열을 활성화하고 거기에 버퍼 객체를 놓습니다. 셰이더가 신경 쓰지 않기 때문에 그 안에 무엇이 있는지는 중요하지 않습니다. 그러나 다른 구현에서 작동하게하려면 무언가를 묶어 라.

+0

glGetError()로 확인했지만 렌더링하는 동안 오류 코드가 없습니다. 버텍스 쉐이더에서 버티컬을 렌더링하려고합니다. – shadeglare

+0

방금 ​​VAO 용 데이터를 설정하려고했지만 아무 것도 변경되지 않았습니다. – shadeglare

+0

@MaxFX, 이것이 문제를 해결하지 못했습니까? –

관련 문제