2012-12-10 45 views
1

有一个奇怪的问题,我的glsl着色器。它不渲染任何东西(例如balck屏幕),并使我的glDrawElements投射GL_INVALID_OPERATION。下图显示了使用的着色器。当我注释掉v = texture3D(texVol,pos).r;并用代替v = 0.4;它输出所期望的(类橙色)并且不产生gl错误。texture3d genereates GL_INVALID_OPERATION

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中,当我直接将它们呈现给屏幕时,它们看起来很好。 我试图chaning到在glBegin/glEnd并绘制四边形立方体,然后我得到了同样的错误。 我无法找到我做错了什么,现在我需要你的帮助。为什么我的texture3D生成GL_INVALID_OPERATION?

注: 我已经启用了2D和3D纹理。

编辑: - 我刚把整个项目上传到github。浏览到更多的代码enter link description here - 这是在Intel HD 3000和Nvidia GT550M

回答

0

测试根据的OpenGL规范glDrawElements()在以下情况下产生GL_INVALID_OPERATION:

  1. 如果几何着色器是有源和模式是与当前安装的程序对象的输入基本类型的几何形状着色器不兼容。

  2. 如果非零缓冲区对象名称被绑定到使能阵列或元件阵列和缓冲对象的数据存储当前映射。

这意味着问题与片段着色器无关。如果您不使用几何着色器,则应相应地修复缓冲区对象。

它看起来像你没有提供你的问题更多的相关信息。

相关问题