2013-03-12 2 views
1

Я пытаюсь узнать современную GLSL, но я не могу даже показать свой куб ...Современные основы GLSL

Это, как я создать ВБО:

glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle); 
    glBufferData(GL_ARRAY_BUFFER, vertexData, GL_STATIC_DRAW); 
    glVertexPointer(3, GL_FLOAT, 0, 0L); 

    glBindBuffer(GL_ARRAY_BUFFER, vboNormalHandle); 
    glBufferData(GL_ARRAY_BUFFER, normalData, GL_STATIC_DRAW); 
    glNormalPointer(GL_FLOAT, 0, 0L);   

    glBindBuffer(GL_ARRAY_BUFFER, vboTextureHandle); 
    glBufferData(GL_ARRAY_BUFFER, textureData, GL_STATIC_DRAW); 
    glTexCoordPointer(2, GL_FLOAT, 0, 0L); 

    glBindBuffer(GL_ARRAY_BUFFER, 0); 

это, как я сделать VBO :

glLoadIdentity(); 

    glPushAttrib(GL_TRANSFORM_BIT); 
    glMatrixMode(GL_MODELVIEW); 

    glTranslatef(0f, 0f, camera.zoom); 

    glRotatef(camera.rotation.x, 1, 0, 0); 
    glRotatef(camera.rotation.y, 0, 1, 0); 
    glRotatef(camera.rotation.z, 0, 0, 1); 

    glTranslatef(camera.position.x, camera.position.y, camera.position.z); 

    glPopAttrib(); 

    texture.bind(); 
    glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle); 
    glVertexPointer(3, GL_FLOAT, 0, 0L); 
    glBindBuffer(GL_ARRAY_BUFFER, vboNormalHandle); 
    glNormalPointer(GL_FLOAT, 0, 0L); 
    glBindBuffer(GL_ARRAY_BUFFER, vboTextureHandle); 
    glTexCoordPointer(2, GL_FLOAT, 0, 0L); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_NORMAL_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

    glMaterialf(GL_FRONT, GL_SHININESS, 10f); 
    glDrawArrays(GL_TRIANGLES, 0, triangles.size() * 3); 

    glDisableClientState(GL_VERTEX_ARRAY); 
    glDisableClientState(GL_NORMAL_ARRAY); 
    glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
    glBindBuffer(GL_ARRAY_BUFFER, 0); 
    TextureImpl.bindNone(); 

, если я не использую любые шейдерные программы или использовать что-то в старом GLSL 120 все делает хорошо, но когда я использую эту программу, которая должна отображать мой куб, как я думаю, я получаю черный экран ...

Vertex программа шейдера:

#version 330 

layout (std140) uniform Matrices { 
    mat4 pvm; 
} ; 

in vec4 position; 

out vec4 color; 

void main() 
{ 
    gl_Position = pvm * position ; 
} 

Фрагмент программы шейдера:

#version 330 

out vec4 outputF; 

void main() 
{ 
    outputF = vec4(1.0, 0.0, 0.0, 1.0); 
} 

Что я сделал не так? Где я могу узнать, как сделать этот базовый материал с помощью современного glsl?

+3

Это неплохое учебное пособие по OpenGL/GLSL: http://www.arcsynthesis.org/gltut/ – antonijn

+2

Кроме того, вы пытаетесь смешивать pre-3.0 OpenGL с 3.0 OpenGL довольно ужасно. Вы не должны использовать глобальные матрицы, предоставляемые функциями OpenGL (вы должны использовать однородные матрицы), вы не должны использовать состояния клиента и не должны использовать стандартные материалы. – antonijn

+0

Да, многие рекомендуют это! Я попытался использовать его, но я все еще не мог найти способ рендеринга ...:/ – Qualphey

ответ

5

То, что мы имеем здесь, является неспособностью общаться.

Рассмотрим это:

glVertexPointer(3, GL_FLOAT, 0, 0L); 

OK. Вы сообщаете OpenGL, что данные позиции предоставляются некоторым объектом буфера и что он имеет 3 поплавки на вершину. Хорошо.

Как OpenGL знает, что данные этой позиции должны идти до position в вершинном шейдере?

Ответ: это не так.

glVertexPointer - это функция, которая была удалена из GL 3.1+. Он не передает данные произвольным входам шейдеров вершин; он подает данные на удаленный ввод вершинного шейдера gl_Vertex. Это жестко закодировано.

Вы должны быть using generic vertex attributes, в основном через glVertexAttribPointer и glEnableVertexAttribArray. Вы также должны быть using VAOs.

Аналогичным образом, OpenGL не может знать, что вы хотите, чтобы его функции были удалены, чтобы подавать данные в форму pvm. Действительно, это намного хуже, потому что вы положили это в a uniform block. Данные для однородного блока должны исходить от user-provided buffer object. Который вы не предоставили, и какой OpenGL не будет волшебным образом предоставлять вам.

Короче говоря, вы не можете смешивать старый код OpenGL с GLSL в современном стиле. Вы можете использовать GLSL старого стиля (используя gl_Vertex и gl_ModelViewProjectionMatrix), но тогда вы не используете GLSL в современном стиле.