2013-08-22 2 views
3

Я учусь учиться GLSL с Java и LWJGL, но в настоящее время у меня проблемы с базовым шейдером вершин.OpenGL Vertex Shader не работает

Vertex Shader:

#version 120 

void main() { 
    gl_Position = gl_Vertex * 0.5; 
} 

Фрагмент Shader:

#version 120 

void main() { 
    gl_FragColor = vec4(1.0, 0.4, 0.4, 1.0); 
} 

Rendering Код:

public void draw() { 
    glBindBuffer(GL_ARRAY_BUFFER, vbo); 
    glVertexPointer(3, GL_FLOAT, 0, 0L); 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glDrawElements(GL_TRIANGLES, size, GL_UNSIGNED_INT, 0); 
    glDisableClientState(GL_VERTEX_ARRAY); 
} 

Компиляция не дает никаких ошибок и пиксельный шейдер работает отлично, окрашивая простой треугольник Я нарисовал. Единственная проблема заключается в том, что я не вижу треугольник с уменьшенным масштабом (коэффициент 0,5), как и ожидалось, его вершины остаются неизменными. Что я делаю не так?

+0

Вы уверены, что программа связана и разрешена? –

+0

Да, Fragment Shader работает. – Thiago

+3

'gl_Position = gl_Vertex * 0.5' изменяет весь 4-мерный вектор, включая w-компонент. Сделайте что-то вроде 'gl_Position = vec4 (gl_Vertex.xyz * 0.5, 1.0)' –

ответ

2

Проблема в том, что gl_Vertex является четырехмерным вектором. Умножение его непосредственно на скаляр не даст вам результатов масштабирования. OpenGL делит x, y, z с w компонентом при преобразовании однородного gl_Position в декартовые координаты экрана. 0,5/0,5 = 1,0, поэтому результат не масштабируется.

gl_Position = gl_Vertex * 0.5; 

Это умножает составляющие x, y, z и w на 0,5. Измените код только на масштаб x, y и z.

gl_Position = vec4(gl_Vertex.xyz * 0.5, gl_Vertex.w); 
+0

Большое спасибо. Это сработало. – Thiago

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