GLSL 制服即使存在并使用也不会激活

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

我正在尝试将我的游戏引擎从 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);
    }
}
c++ opengl glsl glm-math
1个回答
0
投票

我确实发现了问题。问题是变换统一的大小。可能在 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.