5

別の OpenGL ES ドライバー エラーが発生しています。今回は、次の行をコンパイルしようとしています。

precision mediump float; 
varying highp vec2 textureCoordinate; 


void main() { 
 highp vec4 color = texture2D(input0, textureCoordinate); 


vec3 color3 = color.rgb;

vec2 tc = (2.0 * textureCoordinate) - 1.0;
float d = dot(tc, tc);
vec2 lookup = vec2(d, color3.r);

..   
..
}

しかし、私は次の行を取得しています:

GLES20.glLinkProgram(program);

ネイティブ クラッシュ:「致命的なシグナル 11(SIGDEV) at 0x00000060(code = 1), thread 1231」 LG nexus 4 が GPU Adreno を使用しているために発生すると推測していますが、別のクラッシュでもエラー コード 14 でクラッシュします。 - マクロの使用が多すぎます。

4

2 に答える 2

2

シェーダーをコンパイルしたら、シェーダー コンパイルglGetShaderivのステータスを取得します。お気に入り:

GLint compiled;
glGetShaderiv(index, GL_COMPILE_STATUS, &compiled);  //index is the shader value

次に、コンパイル済みがゼロとして返された場合は、最初に情報の長さを取得し、次に次のようなエラー メッセージを取得します。

GLint infoLen = 0;
glGetShaderiv(index, GL_INFO_LOG_LENGTH, &infoLen);

if(infoLen > 1)
{
    char* infoLog = new char(infoLen);
    glGetShaderInfoLog(index, infoLen, NULL, infoLog);
}

infoLog最後に、シェーダーのコンパイルから返されたエラー メッセージを確認します。元の投稿のセグメンテーション違反メッセージは、問題を解決するのに役立つものを何も提供しません.

于 2013-10-07T11:20:40.140 に答える
1

フラグメントシェーダーの短いコードの抜粋からわかる限り、float精度を指定していません。floatES 2.0 では、精度を明示的に指定する必要があります。

precision mediump float;

これについては、仕様の p.1 をお読みください。4.5.3 デフォルトの精度修飾子. シェーダーはfloat、特定の OpenGL ES ドライバーでは精度を指定せずに動作する場合があり、別のドライバーではコンパイルに失敗する場合があります。

ただし、問題の正確な原因を突き止めるには、完全なソース コードが必要です。

正しくコンパイルされるまで、シェーダー コードの一部をコメント アウトすることをお勧めします。このようにして、問題のある行を絞り込みます (SO で回答を待つよりも速いと思います)。

于 2013-10-07T06:32:40.387 に答える