1

我已经用 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)

哪里不对了?我认为这只是一个通知,但它的模式太可疑了。

4

2 回答 2

2

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

#version 120

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

除了你的着色器看起来不错之外,试着在你朋友的机器上弄乱它们,看看问题出在哪里。

还请询问您的朋友他们必须使用什么 GPU,以查看哪些实现显示错误。

哦,您想检查 with 的值,GL_LINK_STATUSglGetProgramiv不是查看日志是否为空。一些实现会在成功和失败时写入日志。GL_LINK_STATUS总是0成功的。

于 2012-10-16T02:18:15.850 回答
1

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

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

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

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

于 2012-10-16T02:38:59.313 回答