无法向着色器发送统一值

问题描述 投票:0回答:2

我试图为我的着色器设置一些统一的值,但我只能得到一个我之前已经使用过的纹理(slot 0),并且所有矩阵都填充了 0.

这是我的代码的一部分。

glUseProgram(VSSMTestShaderProgram);
glUniform1i(glGetUniformLocation(VSSMTestShaderProgram, "depthMap"), 10);
glUniform1i(glGetUniformLocation(VSSMTestShaderProgram, "depth2Map"), 11);
transformLoc = glGetUniformLocation(VSSMTestShaderProgram, "transformToScreenSpace");
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(view_trans));
glm::mat4 shadowProj = glm::ortho(-10.0f, 10.0f, -10.0f, 10.0f, 0.01f, 30.0f);
glm::mat4 shadowTransform = shadowProj * glm::lookAt(glm::vec3(5.0,5.0,5.0), glm::vec3(0.0, 0.0, 0.0), glm::vec3(0.0, 1.0, 0.0));
transformLoc = glGetUniformLocation(VSSMTestShaderProgram, "transformToLightSpace");
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(shadowTransform));
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

这里是着色器代码

//shader for VSSM shadows
const char* vertexVSSMTest = "#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"out vec4 LightSpaceCoord;\n"
"uniform mat4 transformToScreenSpace;\n"
"uniform mat4 transformToLightSpace;\n"
"void main()\n"
"{\n"
"   gl_Position = transformToScreenSpace * vec4(aPos.x, aPos.y, aPos.z, 1.0f);\n"
"   LightSpaceCoord = transformToLightSpace * vec4(aPos.x, aPos.y, aPos.z, 1.0f);\n"
"}\0";
const char* fragVSSMTest = "#version 330 core\n"
"out vec4 FragColor;\n"
"in vec4 LightSpaceCoord;\n"
"uniform sampler2D depthMap;\n"
"uniform sampler2D depth2Map;\n"
"void main()\n"
"{\n"//vec2(LightSpaceCoord.x/2+0.5, LightSpaceCoord.y/2+0.5)
"   float lightDepth = texture(depthMap, vec2(0.1, 0.1)).r;\n"
"   if(lightDepth<LightSpaceCoord.z){\n"
"       FragColor = vec4(lightDepth, lightDepth, lightDepth, 1.0);\n"
"   }else{\n"
"       FragColor = gl_FragColor;\n"
"   }\n"
"}\n\0";

矩阵设置为:

和纹理也设置不正确:

c++ opengl glsl glm-math
2个回答
0
投票

您不能在着色器代码中使用 gl_FragColor 值。


0
投票

根据您发布的代码,您似乎没有做错任何事。这意味着其他地方可能有问题。一个明显的检查点是确保在绑定纹理和调用绘图函数之前调用 glActiveTexture(GL_TEXTUREn),其中 n 是插槽。但是您的代码中的其他地方可能会出现许多错误,因为 openGL 可能对错误的顺序调用等非常敏感。

如果您还没有阅读本教程,我强烈建议您查看:https://learnopengl.com/Advanced-Lighting/Shadows/Shadow-Mapping。特别是查看和复制示例代码。

我还强烈建议抽象出一些 openGL 函数以分离方法并逐步测试每个方法。如果你能让方法做你想让它们做的事,那么你就不必担心这些方法会在未来引起问题。现在你只是直接调用一系列 openGL 函数,这使得很难确定问题到底发生在哪里。

© www.soinside.com 2019 - 2024. All rights reserved.