使用openGL和顶点和片段着色器创建二维网格

使用openGL和顶点和片段着色器创建二维网格,opengl,glsl,fragment-shader,Opengl,Glsl,Fragment Shader,好的,我有一个非常大的正方形(网格),我用三角形组成,然后应用高度贴图来撞击它。我现在要做的就是在上面画网格线。我已经找到了一种方法来实现这一点,但这会导致片段着色器中的33个if语句仅用于x,然后另33个if语句用于y。有人告诉我,我可以使用我现在正在做的事情,并以稍微不同的方式实现它(使用一些GLSL函数),只需要1或2个if语句。这是我当前的代码(还没有全部完成,但让你知道我在做什么。) #版本330 二维纹理均匀; 在vec2 texCoord; 布局(位置=0)输出vec4帧颜色; 真

好的,我有一个非常大的正方形(网格),我用三角形组成,然后应用高度贴图来撞击它。我现在要做的就是在上面画网格线。我已经找到了一种方法来实现这一点,但这会导致片段着色器中的33个if语句仅用于x,然后另33个if语句用于y。有人告诉我,我可以使用我现在正在做的事情,并以稍微不同的方式实现它(使用一些GLSL函数),只需要1或2个if语句。这是我当前的代码(还没有全部完成,但让你知道我在做什么。)

#版本330
二维纹理均匀;
在vec2 texCoord;
布局(位置=0)输出vec4帧颜色;
真空总管(真空){
vec4新颜色;
vec2 line=texCoord*32;//使texCoords更易于编号(在C++数组中除以32)
if(line.x>0&&line.x<0.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
else if(line.x>1&&line.x<1.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
else if(line.x>2&&line.x<2.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
如果(line.x>3&&line.x<3.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
else if(line.x>4&&line.x<4.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
否则如果(第x行>5和第x行<5.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
否则如果(第x行>6和第x行<6.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
else if(line.x>7&&line.x<7.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
else if(line.x>8&&line.x<8.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
else if(line.x>9&&line.x<9.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
否则如果(第x行>10和第x行<10.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
如果(第x行>11和第x行<11.9)出现其他情况
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
否则,如果(第x行>12和第x行<12.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
否则如果(第x行>13和第x行<13.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
否则如果(第x行>14和第x行<14.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
否则如果(第x行>15和第x行<15.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
else if(line.x>16&&line.x<16.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
否则如果(第x行>17和第x行<17.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
否则如果(第x行>18和第x行<18.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
否则如果(第x行>19和第x行<19.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
否则如果(第x行>20和第x行<20.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
否则如果(第x行>21和第x行<21.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
否则如果(第x行>22和第x行<22.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
否则如果(第x行>23和第x行<23.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
否则如果(第x行>24和第x行<24.9)
{
newColor=vec4(1.0,1.0,1.0,1.0);
}
其他的
{
newColor=vec4(0.0,0.0,0.0,1.0);
}
fragColour=新颜色;
}

除非是绝对必要的,否则不应该使用控制流(这取决于统一以外的内容)(至少这是我上次编写glsl着色器时的标准建议)。在您的情况下,不需要控制流。使用
步骤
平滑步骤
混合
和乘法避免控制流

您的“if/else”代码段可以使用以下内容(未经测试的代码)实现:

fragColor=mix(vec4(0.0,0.0,0.0,0.0),vec4(1.0,1.0,1.0,1.0),阶跃(fract(line.x),0.9))

或者使用纹理查找。纹理查找可能比数值计算快,具体取决于硬件(和纹理大小)

请注意,使用“阶跃”可能会在遥远的表面上产生锯齿状的非抗锯齿边和噪声/莫尔图案。“OpenGL orange book”(“OpenGL着色语言”)中有一些例子可以解释如何处理它。但是,使用纹理查找可能更容易。首先,您可以尝试使用“smoothstep”而不是“step”


或者,您也可以简单地在实体渲染的景观上以线框模式重新绘制整个景观。

除非绝对必要,否则不应使用控制流(这取决于统一以外的内容)(至少这是我上次编写glsl着色器时的标准建议)。在您的情况下,不需要控制流。使用
步骤
平滑步骤
混合
和乘法避免控制流

您的“if/else”代码段可以使用以下内容(未经测试的代码)实现:

fragColor=mix(vec4(0.0,0.0,0.0,0.0),vec4(1.0,1.0,1.0,1.0),阶跃(fract(line.x),0.9))

或者使用纹理查找。纹理查找可能比数值计算快,具体取决于硬件(和纹理大小)

请注意,使用“阶跃”可能会在遥远的表面上产生锯齿状的非抗锯齿边和噪声/莫尔图案。“OpenGL orange book”(“OpenGL着色语言”)中有一些例子可以解释如何处理它。但是,使用纹理查找可能更容易。首先,您可以尝试使用“smoothstep”而不是“step”


或者,您也可以简单地在实体渲染的景观上以线框模式重新绘制整个景观。

这很容易通过简单地抛出投影纹理来完成。它甚至不需要“项目”;只需根据
计算纹理坐标即可。事实上,这些很像是你的纹理坐标。因此,只需创建一个内部为白色,外部为适当宽度的黑色的纹理。您甚至可以将其设置为单通道以节省内存


当然,您需要在S和T方向重复纹理。

这很容易通过简单地抛出投影纹理来完成。它甚至不需要“项目”;只需根据
计算纹理坐标即可。事实上,这些应用程序非常有用
#version 330

uniform sampler2D texture;

in vec2 texCoord;

layout (location=0) out vec4 fragColour;



void main(void) {

vec4 newColor;
vec2 line = texCoord * 32; // makes texCoords easier to number (as divided by 32 in the C++array)


if(line.x > 0 && line.x < 0.9)
{
    newColor = vec4(1.0,1.0,1.0,1.0);
}
else if(line.x > 1 && line.x < 1.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 2 && line.x < 2.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 3 && line.x < 3.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 4 && line.x < 4.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 5 && line.x < 5.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 6 && line.x < 6.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 7 && line.x < 7.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 8 && line.x < 8.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 9 && line.x < 9.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 10 && line.x < 10.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 11 && line.x < 11.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 12 && line.x < 12.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 13 && line.x < 13.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 14 && line.x < 14.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 15 && line.x < 15.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 16 && line.x < 16.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 17 && line.x < 17.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 18 && line.x < 18.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 19 && line.x < 19.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 20 && line.x < 20.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 21 && line.x < 21.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 22 && line.x < 22.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 23 && line.x < 23.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}
    else if(line.x > 24 && line.x < 24.9)
{
     newColor = vec4(1.0,1.0,1.0,1.0);
}

else
{
    newColor = vec4(0.0,0.0,0.0,1.0);
}

fragColour = newColor;
}