1

glslシェーダーに奇妙な問題があります。何もレンダリングせず(たとえば、黒い画面)、glDrawElementsにGL_INVALID_OPERATIONをキャストさせます。使用中のシェーダーを以下に示します。v = texture3D(texVol、pos).rで行をコメントアウトすると、そしてそれをv=0.4に置き換えます。期待されるもの(オレンジのような色)を出力し、glエラーは生成されません。

uniform sampler2D texBack;
uniform sampler3D texVol;
uniform vec3 texSize;
uniform vec2 winSize;
uniform float iso;

varying vec3 inCoords;

vec4 raytrace(in vec3 entryPoint,in vec3 exitPoint){
    vec3 dir = exitPoint - entryPoint;
    vec3 pos = entryPoint;
    vec4 color = vec4(0.0,0.0,0.0,0.0);
    int steps = int(2.0*length(texSize));
    dir = dir * (1.0/steps);
    vec3 n;
    float v,m=0.0,avg=0.0,avg2=0.0;
    for(int i = 0;i<steps || i < 2500;i++){
        v = texture3D(texVol,pos).r;
        m = max(v,m);
        avg += v;
        pos += dir;
    }
    return vec4(avg/steps,m,0,1);
}

void main()
{
    vec2 texCoord = gl_FragCoord.xy/winSize;
    vec3 exitPoint = texture2D(texBack,texCoord).xyz;
    gl_FragColor = raytrace(inCoords,exitPoint);
}

光線のエントリおよび存在ポイントとしてカラーキューブをレンダリングするためにVBOを使用しています。それらはFBOに保存されており、画面に直接レンダリングすると問題ないように見えます。glBegin / glEndに変更して、四角形で立方体を描画しようとしましたが、同じエラーが発生します。私は自分が間違っていることを見つけることができません、そして今私はあなたの助けが必要です。texture3DがGL_INVALID_OPERATIONを生成するのはなぜですか?

注:2Dテクスチャと3Dテクスチャの両方を有効にしました。

編集:

4

1 に答える 1

0

OpenGL 仕様によると、glDrawElements() は次の場合に GL_INVALID_OPERATION を生成します。

  1. ジオメトリ シェーダがアクティブで、モードが、現在インストールされているプログラム オブジェクトのジオメトリ シェーダの入力プリミティブ タイプと互換性がない場合。

  2. ゼロ以外のバッファ オブジェクト名が有効な配列または要素配列にバインドされており、バッファ オブジェクトのデータ ストアが現在マップされている場合。

これは、問題がフラグメント シェーダーとは関係がないことを意味します。ジオメトリ シェーダーを使用しない場合は、それに応じてバッファー オブジェクトを修正する必要があります。

質問に追加の関連情報を提供していないようです。

于 2013-12-08T12:13:49.097 に答える