opengl glsl bug,如果我使用具有不同参数的glsl纹理函数,模型将不可见

时间:2017-01-07 15:40:45

标签: c++ opengl glsl shader sfml

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

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

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

立方体有不同的方形类型:空方块(反映环境),墙方块(你不能为它们着色),开始/结束方块(中间有一个黑色方块,但其余部分是彩色的)。

我已接近完成我的项目,但我遇到了一个错误。我用过c ++,sfml,opengl,glm。

问题在于着色器。

顶点着色器:

mysql> SELECT * FROM your_table;
+----+--------+
| id | t      |
+----+--------+
|  1 | abc-2  |
|  2 | abc-21 |
|  3 | abc-32 |
+----+--------+
3 rows in set (0,00 sec)

mysql> ALTER TABLE your_table
    -> ADD s1 VARCHAR(32) GENERATED ALWAYS AS (SUBSTRING_INDEX(t, '-',  1)) STORED,
    -> ADD i1 INT(11)     GENERATED ALWAYS AS (SUBSTRING_INDEX(t, '-', -1)) STORED;
Query OK, 3 rows affected (0,02 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM your_table;
+----+--------+------+------+
| id | t      | s1   | i1   |
+----+--------+------+------+
|  1 | abc-2  | abc  |    2 |
|  2 | abc-21 | abc  |   21 |
|  3 | abc-32 | abc  |   32 |
+----+--------+------+------+
3 rows in set (0,00 sec)

mysql> insert into your_table (id,t) VALUES(4,'abc-9876');
Query OK, 1 row affected (0,00 sec)

mysql> SELECT * FROM your_table;
+----+----------+------+------+
| id | t        | s1   | i1   |
+----+----------+------+------+
|  1 | abc-2    | abc  |    2 |
|  2 | abc-21   | abc  |   21 |
|  3 | abc-32   | abc  |   32 |
|  4 | abc-9876 | abc  | 9876 |
+----+----------+------+------+
4 rows in set (0,00 sec)

mysql> UPDATE your_table set t='abc-2211' where id = 1;
Query OK, 1 row affected (0,01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> SELECT * FROM your_table;
+----+----------+------+------+
| id | t        | s1   | i1   |
+----+----------+------+------+
|  1 | abc-2211 | abc  | 2211 |
|  2 | abc-21   | abc  |   21 |
|  3 | abc-32   | abc  |   32 |
|  4 | abc-9876 | abc  | 9876 |
+----+----------+------+------+
4 rows in set (0,00 sec)

mysql>

片段着色器:

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

在片段着色器中,我绘制具有特定类型的正方形的像素,因此着色器仅在每个正方形的4个if中的1个中进入。如果我只使用具有相同纹理的glsl函数#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 */ ,该程序工作正常。如果我使用此功能2次使用不同的纹理,如果使用2个不同的,我的模型将变为不可见。为什么会这样?

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

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

红色方块是类型1.我已经修改了类型== 0的代码,如果然后我的模型变得不可见。

1 个答案:

答案 0 :(得分:1)

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

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