1

私はC++とPythonでOpenGLプログラムを作成し、このメッセージを受け取るすべてのコンピューターを作成しました

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

空白の画面を表示します。グラフィックを見ることができる他のすべての人は、glGetProgramInfoLog()からのメッセージをまったく持っていません。私のラップトップはそのメッセージを表示し、何も見ることができません。具体的な例。私はOpengl3.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

シェーダーの上部にこれを追加して、GLSL1.20を使用していることを指定してみてください。

#version 120

それ以外のものは、おそらく実装間の小さな違いです。Intelの実装ではtexture2D、テクスチャがバインドされていないときに呼び出すと(0, 0, 0, 1)、NVIDIAとATIの実装が返されることを知っています(0, 0, 0, 0)

シェーダーがきれいに見えること以外は、友達のマシンでシェーダーをいじって、問題がどこにあるかを確認してください。

また、どの実装がエラーを表示しているかを確認するために、どのGPUが必要かを友達に尋ねてください。

ああ、ログが空かどうかを確認するのではなく、GL_LINK_STATUSwithの値を確認したいとします。glGetProgramiv一部の実装では、失敗時だけでなく成功時にもログに書き込みます。GL_LINK_STATUS常に0成功しています。

于 2012-10-16T02:18:15.850 に答える
1

OpenGLバージョンよりもさらに重要なのはドライバーベンダーです。ドライバーが異なれば、出力も異なります。そのため、プログラムが一部のドライバー(ATI、NVidia、またはIntel)と互換性がない可能性が非常に高くなります。プログラムが動作するビデオカードと失敗するビデオカードを確認する必要があります。

私が知る限り、あなたのシェーダーはきれいに見えます。また、情報メッセージ以外に、ドライバからエラーや警告が表示されることはありません。したがって、最も疑わしいのはミップマップテクスチャの初期化であり、これはATIでバグがあることが知られています:http ://www.opengl.org/wiki/Common_Mistakes#Automatic_mipmap_generation 。

完全なプログラムコードを提示していません。したがって、別の可能性は、定数属性の場所にバインドしていることです。ビデオカードドライバは、同じシステムでの実行間でも、個別の属性ロケーションマッピングを生成できます。

TLDR:シェーダーは問題ありませんが、問題は他の場所にあります。このバグは、ドライバーベンダーに依存している可能性があります(ATI、NVidia、またはIntel)。

于 2012-10-16T02:38:59.313 に答える