2013-02-24 4 views
2

В моем игровом движке я рисую фреймбуфер перед рисованием на фактический экран, а затем использую шейдер пост-обработки, чтобы рисовать фактический фреймбуфер. Тем не менее, есть проблема, с которой я сталкиваюсь с драйверами AMD, где мой квадрат работает неправильно.Почему драйвер AMD полностью отображает полноэкранные квадратики?

Код работает как ожидалось на графических процессорах Nvidia и Intel в нескольких операционных системах. Вот пример: http://i.stack.imgur.com/5fiJk.png Он был воспроизведен в трех системах с различным процессором AMD и не был замечен в системах, отличных от AMD.

Код, который создал четверной здесь:

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 в первую очередь? –

 Смежные вопросы

  • Нет связанных вопросов^_^