fshader_src = """
#version 330 core
void main() {
//gl_PointCoord是内置变量,表示顶点坐标 gl_PointCoord的最大值是(1.0,1.0)
//gl_FragColor 也是内置变量,表示顶点坐标对应的像素的颜色值
//计算顶点坐标到指定点(0.5,0.5)之间的距离,
float r = distance(gl_PointCoord, vec2(0.5, 0.5));
//根据距离设置片元
if(r < 0.5){
// 方形区域片元距离几何中心半径小于0.5,像素颜色设置红色
gl_FragColor = vec4(1.0,0.0,0.0,1.0);
}else {
// 方形区域距离几何中心半径大于等于0.5的片元剪裁舍弃掉:
discard;
}
}
"""
你好,我在python里面尝试编写着色器来显示点,但是却发现gl_PointCoord的值始终是0,0,我查询了好久也没有发现问题在哪,希望您可以帮帮我。
看起来这段GLSL代码并没有问题。你是如何确定片元纹理始终不变的呢?渲染管线在渲染片元时针对每个片元都有一个不同的gl_PointCoord,除非顶点只有1个片元————没有开启点精灵(PointSprite)模式,或者视窗缩小到很小的情况下,才会出现这种情况。我猜你的问题是没有开启点精灵模式,或者忘记设置点的size了吧?
如果你想绘制一个点,可以使用gl_PointSize来设置点的大小,并在片元着色器中绘制点的颜色,例如:
fshader_src = """
#version 330 core
out vec4 fragColor;
void main() {
float r = distance(gl_PointCoord, vec2(0.5, 0.5));
if (r < 0.5) {
fragColor = vec4(1.0, 0.0, 0.0, 1.0);
} else {
discard;
}
}
"""
vbo = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, vbo)
glBufferData(GL_ARRAY_BUFFER, np.array([0.5, 0.5]), GL_STATIC_DRAW)
program = compileProgram(
compileShader(vshader_src, GL_VERTEX_SHADER),
compileShader(fshader_src, GL_FRAGMENT_SHADER))
glUseProgram(program)
glBindBuffer(GL_ARRAY_BUFFER, vbo)
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, None)
glEnableVertexAttribArray(0)
glPointSize(50)
glDrawArrays(GL_POINTS, 0, 1)
在这个例子中,我们使用glPointSize设置点的大小,glDrawArrays绘制一个点,并在片元着色器中根据gl_PointCoord来绘制点的颜色。
这个问题可能是由于您的着色器代码有问题导致的。gl_PointCoord的值取决于您在顶点着色器中设置的gl_PointSize值,如果您没有在顶点着色器中设置gl_PointSize,那么gl_PointCoord的值将始终是0.0。因此,您应该在顶点着色器中设置gl_PointSize,然后再在片段着色器中使用gl_PointCoord。