gl_PointCoord始终是0


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了吧?

该回答引用GPTᴼᴾᴱᴺᴬᴵ

gl_PointCoord是一个内置变量,它只在绘制点时才会被赋值,并且它的取值范围是[0,1]。在你的片元着色器中,gl_PointCoord是一个二维向量,表示当前像素在点的几何形状中的位置。在你的代码中,你使用了distance函数来计算gl_PointCoord到(0.5,0.5)的距离,但这个距离的值始终会小于等于0.5,因此只会绘制出红色的像素。

如果你想绘制一个点,可以使用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。