如何避免现代GPU上三角形之间的黑线?

时间:2015-05-29 06:45:54

标签: opengl gpu opengl-3 pyopengl opengl-4

我正在使用obj export构建参数化3d建模器。

我真的很困惑。

我昨晚改变了我的GPU,现在,顶点之间有裂缝,我可以看到背后的东西。我的旧卡是Nvidia GTX275和NVIDIA GTX960。 我在代码,着色器或其他方面没有任何改变。我只使用平面颜色(不是纹理)。

在下图中,将五边形切成三角形的黑线不应该在那里。

enter image description here

这似乎纯粹是一个OpenGL问题,因为当我导出模型并在Blender中查看时,面是连续的并且没有重复的顶点。

着色器代码非常简单:

_VERTEX2 = """
#version 330
#extension GL_ARB_explicit_uniform_location : enable
layout(location = 0 ) in vec3 position;
layout(location = 1 ) in vec4 color;
layout(location = 2 ) in vec3 normal;

varying vec4 baseColor;
// uniform mat4 proj;
layout(location = 0) uniform mat4 view;
layout(location = 4) uniform mat4 proj;

varying vec3 fragVertexEc;

void main(void) {
    gl_Position = proj * view * vec4(position, 1.0);
    fragVertexEc = (view * vec4(position, 1.0)).xyz;
    baseColor = color;
}
"""


_FRAGMENT2 = """
#version 330
#extension GL_OES_standard_derivatives : enable

varying vec3 fragVertexEc;
varying vec4 baseColor;

const vec3 lightPosEc = vec3(0,0,10);
const vec3 lightColor = vec3(1.0,1.0,1.0);

void main()
{
    vec3 X = dFdx(fragVertexEc);
    vec3 Y = dFdy(fragVertexEc);
    vec3 normal=normalize(cross(X,Y));

    vec3 lightDirection = normalize(lightPosEc - fragVertexEc);

    float light = max(0.0, dot(lightDirection, normal));


    gl_FragColor = vec4(normal, 1.0);
    gl_FragColor = vec4(baseColor.xyz * light, baseColor.w);
}
"""

渲染代码也很简单:

def draw(self, view_transform, proj, transform):
    self.shader.use()
    gl_wrap.glBindVertexArray(self.vao)
    try:
        self.vbo.bind()

        view_transform = view_transform * transform
        GL.glUniformMatrix4fv(0, 1, False, (ctypes.c_float*16)(*view_transform.toList()))
        GL.glUniformMatrix4fv(4, 1, False, (ctypes.c_float*16)(*proj.toList()))

        GL.glEnableVertexAttribArray(self.shader.attrib['position'])
        GL.glEnableVertexAttribArray(self.shader.attrib['color'])
        GL.glEnableVertexAttribArray(self.shader.attrib['normal'])

        STRIDE = 40
        GL.glVertexAttribPointer(
            self.shader.attrib['position'], len(Vector._fields), GL.GL_FLOAT,
            False, STRIDE, self.vbo)

        GL.glVertexAttribPointer(
            self.shader.attrib['color'], len(Color._fields), GL.GL_FLOAT,
            False, STRIDE, self.vbo+12)

        GL.glVertexAttribPointer(
            self.shader.attrib['normal'], len(Vector._fields), GL.GL_FLOAT,
            False, STRIDE, self.vbo+28)

        GL.glDrawElements(
            GL.GL_TRIANGLES,
            len(self.glindices),
            self.index_type,
            self.glindices)

    finally:
        self.vbo.unbind()
        gl_wrap.glBindVertexArray(0)
        self.shader.unuse()

一个简单的四元组将以下数据发送到OpenGL:

vertices ( flat array of pos+rgba+normal) :
[5.0, -3.061616997868383e-16, 5.0, 0.898, 0.0, 0.0, 1.0, 0.0, 1.0, 6.123233995736766e-17, 
-5.0, 3.061616997868383e-16, -5.0, 0.898, 0.0, 0.0, 1.0, 0.0, 1.0, 6.123233995736766e-17, 
-5.0, -3.061616997868383e-16, 5.0, 0.898, 0.0, 0.0, 1.0, 0.0, 1.0, 6.123233995736766e-17, 
5.0, 3.061616997868383e-16, -5.0, 0.898, 0.0, 0.0, 1.0, 0.0, 1.0, 6.123233995736766e-17]

indices  :: [0, 1, 2, 0, 3, 1]

1 个答案:

答案 0 :(得分:3)

好的,明白了!

奇怪的显示是由glEnabled(GL_POLYGON_SMOOTH)引起的。

我完全忘记了这件事,因为我的旧卡在这个设置上没有做任何事情。它至少不可见。 但是新的行为具有正确的行为:它试图独立地对每个三角形进行反混叠,因此黑线。

非常感谢@Jerem,他帮我介绍了其他可能性。