2016-01-24 11 views
0

Я очень новичок в OpenGL, и я работал с настройкой ящиков с ящиками и, наконец, исправил его благодаря некоторой помощи здесь, но теперь это шейдер отражения, который я пытался настроить редактирование некоторых, которые я нашел (так что сфера будет иметь основной эффект отражения, основанный на карте куба моего ящика небес), не будет отображаться ни одного цвета, кроме серого, как показано на изображении. http://i.imgur.com/Th56Phg.pngOpenGL Reflection shader, показывающий только серый

Я не имею никакой удачи выясняя, вот мой шейдер код:

Vertex Shader

#version 330 core 

attribute vec3 position; 
attribute vec2 texCoord; 
attribute vec3 normal; 


out vec3 Normal; 
out vec3 Position; 

uniform mat4 model; 
uniform mat4 view; 
uniform mat4 projection; 

uniform mat4 transform; 

void main() 
{ 
    gl_Position = transform * vec4(position, 1.0); 
    Normal = mat3(transpose(inverse(model))) * normal; 
    Position = vec3(model * vec4(position, 1.0f)); 
} 

Фрагмент Shader

#version 330 core 
in vec3 Normal; 
in vec3 Position; 
out vec4 color; 

uniform vec3 cameraPos; 
uniform samplerCube skybox; 

void main() 
{    
    vec3 I = normalize(Position - cameraPos); 
    vec3 R = reflect(I, normalize(Normal)); 
    color = texture(skybox, R); 
} 

И, наконец, это мое использование:

glm::mat4 model; 
     glm::mat4 view = camera.GetViewProjection(); 
     glm::mat4 projection = glm::perspective(70.0f, (float)1600/(float)1200, 0.1f, 1000.0f); 
     glUniformMatrix4fv(glGetUniformLocation(refShader.getProg(), "model"), 1, GL_FALSE, glm::value_ptr(model)); 
     glUniformMatrix4fv(glGetUniformLocation(refShader.getProg(), "view"), 1, GL_FALSE, glm::value_ptr(view)); 
     glUniformMatrix4fv(glGetUniformLocation(refShader.getProg(), "projection"), 1, GL_FALSE, glm::value_ptr(projection)); 
     glUniform3f(glGetUniformLocation(refShader.getProg(), "cameraPos"), camera.getPos().x, camera.getPos().y, camera.getPos().z); 

     glActiveTexture(GL_TEXTURE3); 
     glUniform1i(glGetUniformLocation(refShader.getProg(), "skybox"), 3); 

     shader.Bind(); 
     texture.Bind(0); 
     shader.Update(transformCube, camera); 
     cubeMesh.Draw(); 

     glBindTexture(GL_TEXTURE_CUBE_MAP, skyboxTexture); 
     refShader.Bind(); 
     refShader.Update(transform, camera); 
     sphereMesh.Draw(); 
+0

Возможно, это может быть полезно, хотя http: // antongerdelan.net/opengl/cubemaps.html – Alex

+0

Спасибо, что посмотрели, это одна из страниц, с которой я столкнулся в какой-то момент, все еще просеивая другую. Спасибо за ссылку. – thesyncer

ответ

1

Это sequnece операций является неправильным:

glActiveTexture(GL_TEXTURE3); 
glUniform1i(glGetUniformLocation(refShader.getProg(), "skybox"), 3); 

shader.Bind(); 

форменной в программе состояние в GL и glUniform*() вызовы всегда влияют на форму программы в настоящее время используется. Кажется, вы пытаетесь установить эту форму до того, как программа будет привязана, поэтому она не сработает, и форма в этой программе все равно останется по умолчанию 0.

+0

Это действительно так, перестроенный и теперь работающий по назначению, спасибо! – thesyncer