我的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纹理。
修改
答案 0 :(得分:0)
根据OpenGL规范,glDrawElements()在以下情况下生成GL_INVALID_OPERATION:
如果几何着色器处于活动状态且模式与当前安装的程序对象中几何着色器的输入基元类型不兼容。
如果非零缓冲区对象名称绑定到已启用的数组或元素数组,并且当前已映射缓冲区对象的数据存储。
这意味着问题与片段着色器无关。如果不使用几何着色器,则应相应地修复缓冲对象。
您的问题似乎没有提供其他相关信息。