如果我使用具有不同参数的 glsl 纹理函数,其中模型不可见的 opengl glsl 错误

opengl glsl bug in which model goes invisible if i use glsl texture function with different parameters

我想复制一个游戏。游戏的目标是在任意 2 个颜色相同的方块之间创建一条路径。

这是游戏:www.mypuzzle.org/3d-logic-2

立方体有 6 个面。每个面都有 3x3 个正方形。

立方体有不同的方块类型:空方块(反映环境),墙方块(你不能给它们上色),start/finish方块(中间有一个黑色方块,但其余部分是有色人种)。

我即将完成我的项目,但我遇到了一个错误。我用了c++,sfml,opengl,glm.

问题出在着色器中。

顶点着色器:

#version 330 core

layout (location = 0) in vec3 vPosition;
layout (location = 1) in vec3 vColor;
layout (location = 2) in vec2 vTexCoord;
layout (location = 3) in float vType;
layout (location = 4) in vec3 vNormal;

out vec3 Position;
out vec3 Color;
out vec2 TexCoord;
out float Type;
out vec3 Normal;

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

void main()
{
    gl_Position = projection * view * model * vec4(vPosition, 1.0f);

    Position = vec3(model * vec4(vPosition, 1.0f));
    Color=vColor;
    TexCoord=vTexCoord;
    Type=vType;
    Normal = mat3(transpose(inverse(model))) * vNormal;
}

片段着色器:

#version 330 core
in vec3 Color;
in vec3 Normal;
in vec3 Position;

in vec2 TexCoord;
in float Type;

out vec4 color;

uniform samplerCube skyboxTexture;
uniform sampler2D faceTexture;
uniform sampler2D centerTexture;

void main()
{
    color=vec4(0.0,0.0,0.0,1.0);
    if(Type==0.0)
    {
        vec3 I = normalize(Position);
        vec3 R = reflect(I, normalize(Normal));
        if(texture(faceTexture, TexCoord)==vec4(1.0,1.0,1.0,1.0))
            color=mix(texture(skyboxTexture, R),vec4(1.0,1.0,1.0,1.0),0.3);*/
    }
    else if(Type==1.0)
    {
        if(texture(centerTexture, TexCoord)==vec4(1.0,1.0,1.0,1.0))
            color=vec4(Color,1.0);
    }
    else if(Type==-1.0)
    {
        color=vec4(0.0,0.0,0.0,1.0);
    }
    else if(Type==2.0)
    {
        if(texture(faceTexture, TexCoord)==vec4(1.0,1.0,1.0,1.0))
            color=mix(vec4(Color,1.0),vec4(1.0,1.0,1.0,1.0),0.5);
    }
}

/*
Type== 0 ---> blank square(reflects light)
Type== 1 --->  start/finish square
Type==-1 ---> wall square
Type== 2 ---> colored square that was once a black square
*/

在片段着色器中,我绘制了具有特定类型的正方形的像素,因此着色器仅输入每个正方形的 4 个 if 中的 1 个。如果我只使用具有相同纹理的 glsl 函数 texture,程序运行良好。如果我用不同的纹理使用这个函数 2 次,在 2 个不同的情况下,我的模型就会变得不可见。为什么会这样?

https://postimg.org/image/lximpl0bz/

https://postimg.org/image/5dzvqz2r7/

红色方块是类型 1。我修改了类型 ==0 中的代码,然后我的模型就消失了。

OpenGL 中的纹理采样器只能在(至少)动态统一控制流中访问。这基本上意味着,着色器的所有调用都执行相同的代码路径。如果不是这种情况,则没有自动渐变可用,并且 mipmapping 或各向异性过滤将失败。

在您的程序中,这个问题恰好在您尝试使用多个纹理时发生。一种解决方案可能是不使用任何需要渐变的东西。还有许多其他选项,例如,在纹理图集中将所有纹理拼接在一起,然后仅在着色器中选择适当的 uv 坐标,或者分别绘制每个四边形并通过统一变量提供类型。