다른 여러 프로그램을 올바르게 전환하는 방법에 대해 혼란스러워합니다. 문제를 다음과 같이 좁혔습니다 : NO_HDR로 실행하면 정상적으로 작동합니다. 나는 선들과 우주선들, 그리고 몇몇 구체들, 그 순서대로 렌더링 된 것들을 얻는다. HDR로 실행하면 대부분 같은 결과를 얻지 만 구체 대신 2 차원 정사각형을 얻습니다.glVertexAttribPointer 덮어 쓰기
hdr 부분의 쿼드 정점 속성이 forwardRender() 섹션에서 렌더링 할 마지막 항목을 덮어 쓰고 있다고 생각합니다. forwardRender()에서 순서를 변경하면 forwardRender()에서 마지막으로 렌더링되는 것은 무엇이든 엉망이됩니다. 쿼트 버텍스가 다른 객체를 덮어 쓰는 것을 내가 놓치고있다.
#if NO_HDR
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
forwardRender();
#else
//set to render to custom frame buffer
glBindFramebuffer(GL_FRAMEBUFFER, rt.FramebufferName);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
forwardRender();
//now switch to render to screen
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, rt.renderedTexture);
glUseProgram(hdr.shaderProgram);
glUniform1i(texID, 0);
glBindBuffer(GL_ARRAY_BUFFER, hdr.quad_vertexbuffer);
glEnableVertexAttribArray(hdr.quad_vertexPosition_modelspace);
glVertexAttribPointer(
hdr.quad_vertexPosition_modelspace, // attribute
3, // size
GL_FLOAT, // type
GL_FALSE, // normalized?
0, // stride
(void*)0 // array buffer offset
);
// Draw the triangles !
glBindVertexArray(hdr.vao);
glDrawArrays(GL_TRIANGLES, 0, 6); // 2*3 indices starting at 0 -> 2 triangles
#endif
또 다른 단서 : 나는 끝에 glDrawArrays 후 vertexAttribArray를 사용하지 않도록 설정하면 내 구/사각형이 사라! 참고로
, 여기에 내가 forwardRender()에 구체를 렌더링하는 방법입니다
glUseProgram(globe.shaderProgram);
glm::mat4 mvp = camera * world * position * size * orientation;
GLint uTransform = glGetUniformLocation(shaderProgram, "transform");
glUniformMatrix4fv(uTransform, 1, GL_FALSE, glm::value_ptr(mvp));
glBindVertexArray(globe.vao);
glDrawArrays(drawType, 0, globe.drawCount);
명확하게 말하면 현재 바인딩 된 VAO에 저장된 바인딩은 GL_ELEMENT_ARRAY_BUFFER에 바인딩입니까? – Francis
예. glVertexAttribPointer()가 호출 될 때'GL_ARRAY_BUFFER' 바인딩이 필요하고 버퍼 참조는 그 속성에 대한 상태의 일부가된다. 'GL_ARRAY_BUFFER' 바인딩 자체는 VAO 상태의 일부가 아니며 그리기 호출에 영향을줍니다. –