我正在尝试将我的游戏引擎从 Linux 移植到 Windows,但文本渲染的着色器无法正常工作。请注意,在 Linux 上一切正常。
着色器编译,但程序显示没有活动的制服。我对其他着色器也使用相同的类,并且文本着色器是唯一不起作用的。
程序输出:
Loading shader resources/shaders/text/vertex.glsl resources/shaders/text/fragment.glsl
Loaded shader resources/shaders/text/vertex.glsl resources/shaders/text/fragment.glsl
Active Uniforms: 0
Loading shader resources/shaders/text/vertex.glsl resources/shaders/text/fragment.glsl
Loaded shader resources/shaders/text/vertex.glsl resources/shaders/text/fragment.glsl
Active Uniforms: 0
Loading shader resources/shaders/text/vertex.glsl resources/shaders/text/fragment.glsl
Loaded shader resources/shaders/text/vertex.glsl resources/shaders/text/fragment.glsl
Active Uniforms: 0
Warning: Uniform u_PM doesn't exist
Warning: Uniform u_PM doesn't exist
Warning: Uniform u_PM doesn't exist
Warning: Uniform textColor doesn't exist
Warning: Uniform transforms doesn't exist
Warning: Uniform letterMap doesn't exist
Warning: Uniform textColor doesn't exist
Warning: Uniform transforms doesn't exist
Warning: Uniform letterMap doesn't exist
顶点着色器:
#version 460 core
layout(location=0) in vec2 vertex;
out VS_OUT{
vec2 TexCoords;
flat int index;
}outputs;
uniform mat4 transforms[400];
uniform mat4 u_PM;
void main(){
gl_Position=u_PM*transforms[gl_InstanceID]*vec4(vertex.xy,0.0,1.0);
outputs.index=gl_InstanceID;
outputs.TexCoords=vertex.xy;
outputs.TexCoords.y=1.0f-outputs.TexCoords.y;
}
片段着色器:
#version 460 core
layout(location=0) out vec4 color;
in VS_OUT{
vec2 TexCoords;
flat int index;
}inputs;
uniform sampler2DArray text;
uniform int letterMap[400];
uniform vec3 textColor;
void main(){
vec4 sampled=vec4(1.0,1.0,1.0,texture(text,vec3(inputs.TexCoords.xy,letterMap[inputs.index])).r);
color=vec4(textColor,1.0)*sampled;
}
使用着色器的代码:
inline void UpdateProjMat(glm::mat4 &proj){
if(m_Loaded){
m_Shader.Bind();
m_Shader.SetUniformMat4fv("u_PM",glm::value_ptr(proj),1);
}
}
void TextRenderer::_DrawText(const std::string &text,float x,float y,float scale,Vec3 color){
PROFILE_FUNCTION();
if(!m_Loaded){
return;
}
float copyX=x;
m_Shader.Bind();
m_Shader.SetUniform3f("textColor",color.r,color.g,color.b);
//other stuff
Render(workingIndex);
}
void TextRenderer::Render(int num_characters){
PROFILE_FUNCTION();
if(num_characters!=0){
m_Shader.SetUniformMat4fv("transforms",glm::value_ptr(m_Transforms[0]),num_characters);
m_Shader.SetUniform1iv("letterMap",&m_ToRender[0],num_characters);
glDrawArraysInstanced(GL_TRIANGLE_STRIP,0,4,num_characters);
}
}
我确实发现了问题。问题是变换统一的大小。可能在 Windows 和 Linux 上,我的 GPU 有两个不同的可以存储的最大制服数量值。
我只是通过减小数组的大小来使其工作
#version 460 core
layout(location=0) in vec2 vertex;
out VS_OUT{
vec2 TexCoords;
flat int index;
}outputs;
uniform mat4 transforms[200];
uniform mat4 u_PM;
void main(){
gl_Position=u_PM*transforms[gl_InstanceID]*vec4(vertex.xy,0.0,1.0);
outputs.index=gl_InstanceID;
outputs.TexCoords=vertex.xy;
outputs.TexCoords.y=1.0f-outputs.TexCoords.y;
}