着色器链接但不适用于某些人

时间:2012-10-16 01:36:14

标签: python opengl glsl shader

我用C ++和Python编写了OpenGL程序,以及所有收到此消息的计算机

vertex shader(s) linked fragment shader(s) linked

显示空白屏幕。所有其他可以看到图形的人都没有来自glGetProgramInfoLog()的消息 我的笔记本电脑显示该消息,看不到任何内容。一个具体的例子。我有Opengl 3.1我的一个朋友有3.2他看不到我总能做到的任何事情。他得到了这个消息。这也发生在我的C ++程序上。是否需要先验证程序? 7个人中有3个看不到任何东西,他们都得到了这个消息。那些可以看到它的人不会从着色器中获得单个消息。

我的着色器上的所有内容。

def init_shaders(self):
    vert_shader=glCreateShader(GL_VERTEX_SHADER)
    frag_shader=glCreateShader(GL_FRAGMENT_SHADER)

    vert_text="""
    varying vec2 texcoord;
    attribute vec3 inputvertex;
    uniform float ifintex;
    attribute vec2 input_texcoord;
    void main() {
        texcoord = (gl_MultiTexCoord0.xy*ifintex)+input_texcoord.xy;
        vec4 position = vec4(inputvertex,1.0);
        gl_Position = gl_ModelViewProjectionMatrix * position;
    }
    """

    frag_text="""
    uniform sampler2D texture_map;
    uniform vec4 add_color;

    varying vec2 texcoord;

    void main(){

        gl_FragColor = texture2D(texture_map, texcoord.xy)+add_color;

    }
    """

    glShaderSource(vert_shader,vert_text)
    glShaderSource(frag_shader,frag_text)

    glCompileShader(vert_shader)
    glCompileShader(frag_shader)

    self.Shader=glCreateProgram()
    glAttachShader(self.Shader,vert_shader)
    glAttachShader(self.Shader,frag_shader)
    glLinkProgram(self.Shader)
    error=glGetProgramInfoLog(self.Shader)
    if error!="":
        print error
    else:
        print "Shaders Compiled"

    glUseProgram(self.Shader)

有什么不对吗?我认为这只是一个通知,但它太可疑了。

2 个答案:

答案 0 :(得分:2)

尝试通过将其添加到着色器的顶部来指定您正在使用GLSL 1.20:

#version 120

其他任何可能是实现之间的细微差别。我知道在没有绑定纹理时调用texture2D的英特尔实现返回(0, 0, 0, 1),而NVIDIA和ATI实现返回(0, 0, 0, 0)

除了你的着色器看起来很好,试着在朋友的机器上弄乱他们,看看问题出在哪里。

还要问你的朋友他们有什么GPU可以看到哪些实现显示错误。

哦,您希望使用GL_LINK_STATUS检查glGetProgramiv的值,而不是查看日志是否为空。有些实现会在成功和失败时写入日志。 <{1}}成功时总是GL_LINK_STATUS

答案 1 :(得分:1)

比OpenGL版本更重要的是驱动程序供应商。不同的驱动器有不同的输出因此,您的程序很可能与某些驱动程序(ATI,NVidia或Intel)不兼容。您应该找出您的程序使用的视频卡以及它失败的视频卡。

据我所知,你的着色器看起来很好。此外,除了信息消息之外,您永远不会从驱动程序中收到任何错误或警告。因此,最可能的嫌疑是mip-map纹理初始化,已知在ATI上有错误:http://www.opengl.org/wiki/Common_Mistakes#Automatic_mipmap_generation

您尚未提供完整的程序代码。所以另一种可能性是你绑定到一个常量属性位置。即使在同一系统上运行,视频卡驱动程序也可以生成不同的属性位置映射。

TLDR:你的着色器很好,问题出在其他地方。该错误最有可能是驱动程序供应商(ATI,NVidia或Intel)。