2012-03-17 2 views
1

OpenGL VAOs/VBOs에서 핸들을 얻으려고하고 개념적으로 나는 거기에 있지만 어떤 이유로 든이 응용 프로그램은 화면에 아무 것도 그리지 않습니다. 4.2 컨텍스트에서 작업하고 있지만 코어 전용 3.3을 쓰고 있습니다. init_scene를라는 함수에서OpenGL 3.3 응용 프로그램에서 아무 것도 그리지 않는 이유는 무엇입니까?

// Tetrahedron vertices 
GLfloat tetra_vertices[12]; 
GLuint tetra_vao; 
GLuint tetra_vbo; 

나는 다음과 같은 한 :

glGenVertexArrays(1, &tetra_vao); 
glBindVertexArray(tetra_vao); 
glGenBuffers(1, &tetra_vbo); // One for vertex locations 
glBindBuffer(GL_ARRAY_BUFFER, tetra_vbo); // Bind vertex locations buffer 
glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), tetra_vertices, GL_STATIC_DRAW); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(0); 

을 그리고 내 GLSL 프로그램이 연결되는 경우 :

여기에 해당 변수에 대한 선언이다

for (int i = 0; i < num_shaders; ++i) 
    glAttachShader(program, shaders[i]); 
glBindAttribLocation(program, 0, "in_position"); 
glLinkProgram(program); 

하나의 속성 만 사용하고 있으며 정점 위치입니다. 프로그램은 오류없이 링크됩니다.

다음은 draw_scene 함수 자체입니다 :

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glBindVertexArray(tetra_vao); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 12); 
glBindVertexArray(0); 

그리고 좋은 측정을 위해, 내 버텍스 쉐이더 :

#version 330 
in vec3 in_position; 
uniform mat4 modelview_matrix; 
void main(void) { 
    gl_Position = vec4(in_position, 1.0f) * modelview_matrix; 
} 

modelview_matrix 단지 행렬에 통과하는 순간의 균일입니다. 뭔가 내가 간단하게 볼 수없는 것을 그려 질 수 잠시 생각, 그래서 나는 회색으로 내 투명 색상을 설정하고 여기에 바로 출력이 흰색해야 프래그먼트 쉐이더입니다 :

#version 330 
out vec4 vFragColor; 
void main(void) 
{ 
vFragColor = vec4(1.0f); 
} 

모든 내가 읽은 , 특히 this tutorial과 Superbible은 꽤 명확 일련의 사건합니다

  • 을 VAO
  • 바인드 VAO
  • 만들기 VBO
  • 빈 만들기 D 및 속성 포인터 I 시도하고이 작동하지 않는 이유에 대한 명확한 그림을 얻기 위해 glDEBugger을 사용

을 설정 VBO

  • 을 입력합니다. GL 오류가 설정되어있어 GL 함수 자체에서 발생하는 오류가 없습니다. VBO의 내용을 볼 수 있습니다. 그리고 그것은 제가 기대했던 정점 데이터입니다. 확실하지 않은 유일한 방법은 VBO가 VAO와 정점 위치 데이터로 연결되어 있는지, 그리고 어떻게 그려지는 함수를 호출 할 때 VAO가 실제로 올바르게 바인딩되어 있는지 확인하는 것입니다.

    내가 빠뜨린 것이 있다면 알려 주시기 바랍니다. 감사!

    업데이트 1 : 여기

    는 VBO에로드 정점 데이터를 제공 배열 :

    tetra_vertices = { 
        0.7f, 0.7f, 0.7f, 
        -0.7f, -0.7f, 0.7f, 
        -0.7f, -0.7f, -0.7f, 
        0.7f, -0.7f, 0.7f 
    }; 
    

    가 여기 내 상황에 맞는 설정 물건의 모든 모습입니다 같은 :

    glClearColor(0.2,0.2,0.2,0.0); 
    glClearDepth(1.0); 
    glViewport(0, 0, properties.size_x, properties.size_y); 
    glEnable(GL_DEPTH_TEST); 
    glCullFace(GL_BACK); 
    glEnable(GL_CULL_FACE); 
    glEnable(GL_VERTEX_ARRAY); 
    glEnable(GL_MULTISAMPLE); 
    

    업데이트 2 :

    니콜 볼라스 (Nicol Bolas)의 대답은 내가 생각하지 못했던 정사각형 가시성에 대해 좋은 점을 제기했습니다. 불행히도 문제는 아닌 것 같습니다. 나는 그의 정점 목록을 시도하고 도태 꺼져,이 정점 시도 : 생각, 여전히 아무것도 사각형을 그릴 수 없지만,해야

    tetra_vertices = { 
        -0.7f, -0.7f, 0.0f, 
        -0.7f, 0.7f, 0.0f, 
        0.7f, -0.7f, 0.0f, 
        0.7f, 0.7f, 0.0f 
    }; 
    

    합니다. 나는 또한 12 개 요소 (12 좌표 = 4 x, y, z 정점)를 가져야한다고했을 때 glDrawArrays을 12 개의 요소로 호출하고 있음을 발견했지만 문제가 해결되지 않았습니다. ("게시물이 너무 오래 되십시오"또는,)

    업데이트 3 : 응용 프로그램 단계별 gDEBugger를의를 통해 걷는 , 나는 이상한 인상을 받았는데 뭔가를 발견했습니다. draw 함수에는 현재 VAO를 바인드하는 일반적인 사이클 인 glDrawArrays이 있고 VAO 0을 바인드하여 다른 것을 그릴 수 있습니다. 이런 상황에서 GL 상태 설정을 관찰하면 내 VAO가 바인드되지 않은 경우 (즉, VAO 0이 바인드 된 경우) TRUE이고 VAO가 바인드되는 경우 FALSE 인 것처럼 보입니다. 이 것이 사물의 방식입니까? GL_VERTEX_ARRAY은 (으)로 보완되기보다는 glBindVertexArray으로 대체되는 상태를 나타 냅니까? 또한 GL_TRIANGLE_STRIP에서 GL_POINTS으로 모드를 변경하고 glPointSize(5.0f)으로 설정하면 단일 점이 0으로 그려 지므로 점이 생성되고 있지만 내 버텍스 쉐이더가 제대로 처리하지 못하는 것처럼 보입니다.

  • +0

    정점 데이터 란 무엇입니까? 초기화 코드의 나머지 부분은 어디에 있습니까? –

    +0

    @NicolBolas 이것 좀 봐 주셔서 감사합니다. 버텍스 데이터와 초기화를 내 포스트에 추가했습니다. –

    답변

    4
    tetra_vertices = { 
        0.7f, 0.7f, 0.7f, 
        -0.7f, -0.7f, 0.7f, 
        -0.7f, -0.7f, -0.7f, 
        0.7f, -0.7f, 0.7f 
    }; 
    

    매트릭스가 신원이므로 사용자는 구적 투영법을 사용하고 있습니다. 그래서 기본적으로, 우리는 Z 값을 무시할 수 있습니다; 그들은 중요하지 않습니다.

    삼각형 스트립으로 그리면 두 개의 삼각형이 생깁니다.

    첫 번째 삼각형은 {(0.7f, 0.7f), (-0.7f, -0.7f), (-0.7f, -0.7f)}입니다. 이 삼각형은 두 개의 점이 같으므로이므로 표면이 보이지 않습니다. 가시 영역이없는 삼각형은 보이지 않습니다.

    두 번째 삼각형은 {(-0.7f, -0.7f), (-0.7f, -0.7f), (0.7f, -0.7f)}입니다. 이전과 마찬가지로 포인트 중 두 개가 동일하므로 삼각형에 가시 영역이 없습니다.

    tetra_vertices = { 
        0.7f, 0.7f, 0.0f, 
        -0.7f, 0.7f, 0.0f, 
        -0.7f, -0.7f, 0.0f, 
        0.7f, -0.7f, 0.0f 
    }; 
    

    당신에게 유용한 무언가를 얻을 가능성이있다 :

    당신은 아마 같은 것을 의미했다. 그래도 아무 것도 보이지 않으면 얼굴 도려기를 해제하십시오.

    +0

    그건 좋은 지적이고, 내가 고려하지 않은 것입니다. 나는 그것을 시험해 보았지만 아아, 주사위는 사용하지 않았다. 나는'glDrawArrays'의 모드를'GL_POINTS','GL_LINES','GL_TRIANGLES'로 설정하려했지만 그 중 아무 것도 보여주지 않았습니다. –

    관련 문제