我想复制一个游戏。游戏的目标是在任何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的代码,如果然后我的模型变得不可见。
答案 0 :(得分:1)
OpenGL中的纹理采样器只能在(至少)动态统一控制流中访问。这基本上意味着着色器的所有调用都执行相同的代码路径。如果不是这种情况,那么没有自动渐变可用,并且mipmapping或各向异性过滤将失败。
在您的程序中,当您尝试使用多个纹理时,会出现此问题。一种解决方案可能是不使用任何需要渐变的东西。还有许多其他选项,例如,在纹理图集中将所有纹理拼接在一起,只需在着色器中选择合适的uv坐标或分别绘制每个四边形,并通过统一变量提供类型。