2013-02-24 5 views
2

내 게임 엔진에서 실제 화면으로 그리기 전에 프레임 버퍼에 그립니다. 그런 다음 사후 처리 쉐이더를 사용하여 실제 프레임 버퍼로 그립니다. 그러나 내 쿼드가 잘못 렌더링되는 AMD 드라이버에서 발생하는 문제가 있습니다.AMD 드라이버가 전체 화면 쿼드를 잘못 렌더링하는 이유는 무엇입니까?

코드는 여러 운영 체제에서 Nvidia 및 Intel GPU 모두에서 예상대로 작동합니다. 여기 예가 있습니다 : http://i.stack.imgur.com/5fiJk.png 다른 AMD gpus를 사용하는 3 개의 시스템에서 재현되었으며 비 AMD 시스템에서는 보이지 않았습니다.

쿼드을 생성 된 코드

은 여기에 있습니다 : I는 두 개의 독립적 인 삼각형을 사용하는 등 다른 옵션을 시도했지만 아무것도 지금까지 근무하지 않았다

static int data[] = { 
    0, 0, 
    0, 1, 
    1, 1, 
    1, 0 
}; 
GLuint vao, vbo; 
glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 
glGenBuffers(1, &vbo); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferData(GL_ARRAY_BUFFER, sizeof(data), &data, GL_STATIC_DRAW); 
glVertexAttribPointer(0, 2, GL_INT, GL_FALSE, 0, NULL); 
glVertexAttribPointer(1, 2, GL_INT, GL_FALSE, 0, NULL); 
glEnableVertexAttribArray(0); 
glEnableVertexAttribArray(1); 
/* code which draws it */ 
glBindVertexArray(vao); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glDrawArrays(GL_TRIANGLE_FAN, 0, 4); 

. 나는이 동작이 AMD 드라이버에서 발생하는 이유에 대해 완전히 분실했다.

답변

2

그런 다음 GL_INT으로 보내지 마십시오. 위치 당 8 바이트를 이미 사용하고 있으므로 GL_FLOAT 및 부동 소수점 값을 사용할 수 있습니다. 공간을 절약하려면 GL_SHORT 또는 GL_BYTE을 사용하십시오.

예. 기술적으로 드라이버 버그입니다. 하지만 GL_INT을 사용하면 아무 것도 얻지 못할 것입니다.

+0

수레를 사용하여 문제가 해결되었습니다. 나는 당신이 내가 운전수 버그로 인해 플로트를 사용해야한다는 것을 의미한다는 것을 즉시 깨닫지 못했습니다. –

+0

// 왜 사람들이 GL_INT로 처음에 그들을 보낼까요? –