Opengl着色器为正方形的边缘着色
Opengl shader to colour edges of square
我有一个显示正方形的基本 opengl 应用程序,正方形颜色是使用插值法确定的。在我的片段着色器中,我试图检测像素是否沿着正方形的边缘之一运行,如果是,则将其着色为黑色。
这是我的顶点着色器。
#version 330
layout (location = 0) in vec3 pos;
out vec4 vertColour;
uniform mat4 model;
uniform mat4 projection;
void main()
{
gl_Position = projection * model * vec4(pos.x, pos.y, pos.z, 1.0);
vertColour = vec4(clamp(pos, 0.0f, 1.0f), 1.0f);
}
还有我的片段着色器
#version 330
out vec4 colour;
in vec4 vertColour;
void main()
{
float x = gl_FragCoord.x;
float y = gl_FragCoord.y;
float z = gl_FragCoord.z;
if((x == 1 && y == 1) ||
(x == -1 && y == -1) ||
(x == 1 && y == -1) ||
(x == -1 && y == 1) ||
(x == 1 && z == 1) ||
(x == -1 && z == -1) ||
(x == -1 && z == 1) ||
(x == 1 && z == -1) ||
(y == 1 && z == 1) ||
(y == -1 && z == -1) ||
(y == 1 && z == -1) ||
(y == -1 && z == 1))
{
colour = vertColour;
} else {
colour = vertColour;
}
}
这是我用来形成正方形的索引和顶点。
int[] indices = {
0,1,4,
4,5,1,
1,0,3,
3,2,1,
1,5,6,
6,1,2,
2,6,7,
7,6,5,
5,4,7,
7,2,3
};
float[] vertices = {
-1.0f, -1.0f, -1.0f,
-1.0f, -1.0f, 1.0f,
1.0f, -1.0f, 1.0f,
1.0f, -1.0f, -1.0f,
-1.0f, 1.0f, -1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 1.0f, -1.0f,
};
实际上,我正在尝试确定当前片段的位置是否位于每条边的最大值/最小值处。这是我在尝试大纲之前看到的
当我尝试应用轮廓时,整个立方体都变黑了。我假设片段着色器中的逻辑有问题,但未能发现问题。欢迎任何帮助。
gl_FragCoord.xy
包含window坐标,单位为像素(水平和垂直片段)。左下坐标为(0.5, 0.5) 右上坐标为(width-0.5, height-0.5).
如果要获取立方体上片段的顶点坐标,需要将pos从顶点传递给片段着色器:
顶点着色器:
layout (location = 0) in vec3 pos;
out vec3 vertPos;
void main()
{
vertPos = pos;
// [...]
}
片段着色器:
in vec3 vertPos;
// [...]
我有一个显示正方形的基本 opengl 应用程序,正方形颜色是使用插值法确定的。在我的片段着色器中,我试图检测像素是否沿着正方形的边缘之一运行,如果是,则将其着色为黑色。
这是我的顶点着色器。
#version 330
layout (location = 0) in vec3 pos;
out vec4 vertColour;
uniform mat4 model;
uniform mat4 projection;
void main()
{
gl_Position = projection * model * vec4(pos.x, pos.y, pos.z, 1.0);
vertColour = vec4(clamp(pos, 0.0f, 1.0f), 1.0f);
}
还有我的片段着色器
#version 330
out vec4 colour;
in vec4 vertColour;
void main()
{
float x = gl_FragCoord.x;
float y = gl_FragCoord.y;
float z = gl_FragCoord.z;
if((x == 1 && y == 1) ||
(x == -1 && y == -1) ||
(x == 1 && y == -1) ||
(x == -1 && y == 1) ||
(x == 1 && z == 1) ||
(x == -1 && z == -1) ||
(x == -1 && z == 1) ||
(x == 1 && z == -1) ||
(y == 1 && z == 1) ||
(y == -1 && z == -1) ||
(y == 1 && z == -1) ||
(y == -1 && z == 1))
{
colour = vertColour;
} else {
colour = vertColour;
}
}
这是我用来形成正方形的索引和顶点。
int[] indices = {
0,1,4,
4,5,1,
1,0,3,
3,2,1,
1,5,6,
6,1,2,
2,6,7,
7,6,5,
5,4,7,
7,2,3
};
float[] vertices = {
-1.0f, -1.0f, -1.0f,
-1.0f, -1.0f, 1.0f,
1.0f, -1.0f, 1.0f,
1.0f, -1.0f, -1.0f,
-1.0f, 1.0f, -1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 1.0f, -1.0f,
};
实际上,我正在尝试确定当前片段的位置是否位于每条边的最大值/最小值处。这是我在尝试大纲之前看到的
当我尝试应用轮廓时,整个立方体都变黑了。我假设片段着色器中的逻辑有问题,但未能发现问题。欢迎任何帮助。
gl_FragCoord.xy
包含window坐标,单位为像素(水平和垂直片段)。左下坐标为(0.5, 0.5) 右上坐标为(width-0.5, height-0.5).
如果要获取立方体上片段的顶点坐标,需要将pos从顶点传递给片段着色器:
顶点着色器:
layout (location = 0) in vec3 pos;
out vec3 vertPos;
void main()
{
vertPos = pos;
// [...]
}
片段着色器:
in vec3 vertPos;
// [...]