4

PCで実行したい例がいくつかあります。問題は、それらがglsl target 150で記述されており、私のPCはバージョン120しかサポートしていないことです。プログラム自体はOpenGL3.1の拡張機能を必要としないほど単純であると確信しています。glslを変換するためにどのような手順を実行する必要があるかについての情報を見つけました(feは属性に変更され、変更されます)が、まだコンパイルされていません(これから意味のあるエラーメッセージを取得することは実際に可能ですか?)。

元の.vert

#version 150
in  vec2 in_Position;
in  vec3 in_Color;
out vec3 ex_Color;
void main(void) {
    gl_Position = vec4(in_Position.x, in_Position.y, 0.0, 1.0);
    ex_Color = in_Color;
}

オリジナルの.frag

#version 150
precision highp float;

in  vec3 ex_Color;
out vec4 gl_FragColor;

void main(void) {
    gl_FragColor = vec4(ex_Color,1.0);
}

変更された.vert

#version 120 
attribute  vec2 in_Position; 
attribute  vec3 in_Color; 
varying vec3 ex_Color; 
void main(void) { 
    gl_Position = vec4(in_Position.x, in_Position.y, 0.0, 1.0); 
    ex_Color = in_Color; 
}

.fragを変更しました

#version 120 
precision highp float; 

attribute  vec3 ex_Color; 

void main(void) { 
    gl_FragColor = vec4(ex_Color,1.0); 
} 

それで、誰かがここで問題を見つけることができますか?

4

3 に答える 3

4

glGetShaderInfoLogコンパイル/リンクのエラーメッセージを取得するには、シェーダーとglGetProgramInfoLogプログラムのコマンドを使用する必要があります。

これらはあなたの特定のエラーが何であるかを教えてくれます。

エラーが何であるかを突き刺すだけattributeで、フラグメントシェーダーで入力を宣言していることになります。これは、である必要があると思いますvarying。属性はデータ->頂点シェーダー用であり、バリエーションは頂点シェーダー->フラグメントシェーダー用です。

glsl 120の仕様には、高精度修飾子は「将来の使用のために予約されている」と記載されているため、バージョン120には適用できない可能性があります。おそらく省略できます。

ただし、infolog関数については、最終的には間違いなく必要になるので、慣れておく必要があります。

于 2012-10-23T21:27:54.730 に答える
3

「情報ログ」を取得すると、コンパイルエラーが発生する可能性があります。

GLuint nVertexShader, nPixelShader;   // handles to objects
GLint  vertCompiled, fragCompiled;    // status values
GLint  linked;

glCompileShader(nVertexShader);
glGetShaderiv(nVertexShader, GL_COMPILE_STATUS, &vertCompiled);

vertCompiled(またはfragCompile)== 0の場合、これを実行して理由を確認します。

int infologLength = 0;
int charsWritten  = 0;

glGetShaderiv(nVertexShader, GL_INFO_LOG_LENGTH, &infologLength);

if (infologLength > 0)
{
    GLchar* infoLog = (GLchar *)malloc(infologLength);
    if (infoLog == NULL)
    {
        printf( "ERROR: Could not allocate InfoLog buffer");
        exit(1);
    }
    glGetShaderInfoLog(nVertexShader, infologLength, &charsWritten, infoLog);
    printf( "Shader InfoLog:\n%s", infoLog );
    free(infoLog);
}

リンクでも同じことができます。linked==0を確認し、上記のようにログを取得します。

glLinkProgram(m_nProgram);
glGetProgramiv(m_nProgram, GL_LINK_STATUS, &linked);
于 2012-10-23T21:28:27.293 に答える
1
precision highp float; 

これはGLSL1.20では合法ではありません。精度修飾子はGLSLESでのみ有用なことを行い、1.50シェーダーをGLSL ESと共有することはできないため、なぜ1.50シェーダーに配置されたのかさえわかりません。

于 2012-10-23T21:29:52.000 に答える