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 回答