OpenGL Reflection shader showing only grey

偶尔善良 提交于 2019-12-12 05:25:15

问题


I'm very new to OpenGL and I've been working with setting up sky boxes, and finally fixed it thanks to some help here but now the reflection shader I've tried to set up by editing some I've found (so a sphere will have a basic reflection effect based on the cube map of my sky box) will not show any color but grey as shown in the image. http://i.imgur.com/Th56Phg.png

I'm having no luck figuring out, here is my shader code:

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));
}  

Fragment 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);
}

And finally this is my usage:

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();

回答1:


This sequnece of operations is wrong:

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

shader.Bind();

Uniforms are per program state in the GL, and glUniform*() calls always affect the uniforms of the program currently in use. You seem to try to set this uniform before the program is bound, so it will fail, and the uniform in that program will still stay at the default value of 0.



来源:https://stackoverflow.com/questions/34970832/opengl-reflection-shader-showing-only-grey

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!