Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 在光线投射中丢弃某些体素_Opengl_Glsl_Shader_Raycasting_Volume Rendering - Fatal编程技术网

Opengl 在光线投射中丢弃某些体素

Opengl 在光线投射中丢弃某些体素,opengl,glsl,shader,raycasting,volume-rendering,Opengl,Glsl,Shader,Raycasting,Volume Rendering,我在着色器中有一个使用该技术的体渲染实现。基本上,我在场景的中心有一个单位立方体。 我在顶点着色器中渲染单位立方体的顶点,并将纹理坐标传递给片段着色器,如下所示: in vec3 aPosition; uniform mat4 uMVPMatrix; smooth out vec3 vUV; void main() { gl_Position = uMVPMatrix * vec4(aPosition.xyz,1); vUV = aPosition + vec3(0.5); } 由

我在着色器中有一个使用该技术的体渲染实现。基本上,我在场景的中心有一个单位立方体。 我在顶点着色器中渲染单位立方体的顶点,并将纹理坐标传递给片段着色器,如下所示:

in vec3 aPosition;
uniform mat4 uMVPMatrix;
smooth out vec3 vUV;
void main() {
   gl_Position = uMVPMatrix * vec4(aPosition.xyz,1);
   vUV = aPosition + vec3(0.5);
}
由于单位立方体坐标从-0.5到0.5,我通过添加0.5将纹理坐标从0.0钳制到1.0

在片段着色器中,我获得了由光栅化器插值的纹理坐标:

...
smooth in vec3 vUV; // Position of the data interpolated by the rasterizer
...
void main() {
    ...
    vec3 dataPos = vUV;
    ...
    for (int i = 0; i < MAX_SAMPLES; i++) {
        dataPos = dataPos + dirStep;
        ...
        float sample = texture(volume, dataPos).r;
        ...//Some more operations on the sampled color
        float prev_alpha = transferedColor.a * (1.0 - fragColor.a);
        fragColor.rgb += prev_alpha * transferedColor.rgb; 
        fragColor.a += prev_alpha; //final color
        if(fragColor.a>0.99)
            break;
    }
}
。。。
在vec3 vUV中平滑;//光栅化器插值的数据的位置
...
void main(){
...
vec3-dataPos=vUV;
...
对于(int i=0;i0.99)
打破
}
}
我的渲染效果很好

现在我已经实现了一个选择算法,它可以很好地处理粒子(世界坐标中的真实顶点)

我的问题是如何使用体积数据集?因为我只有单位立方体的顶点。由于数据点由光栅化器插值,我不知道体素的真实(世界)坐标


对我来说,获得体素的中心坐标并将其视为粒子,这样我就可以在片段着色器中省略或包含必要的体素(我猜是vUV坐标?)。

首先,你必须计算出采样的体素坐标。(我假设体积是你的3D纹理)。要找到它,您必须将其从dataPos解线性化为3D纹理中的3轴组件(w x h x d)。因此,如果MAX_SAMPLES中的一个样本有一个像((z*d)+y)*h+x那样计算的索引,那么坐标可以通过

z=地板(样品/(w*h))

y=地板((样本-(z*w*h))/w)

x=样品-(z*w*h)-(y*w)

楼层操作对于检索整数索引很重要

这是你们样品的坐标。现在您可以将其与用于4个顶点的mvp的倒数相乘,这将为您提供示例在世界空间中的位置(或中心,可能需要添加vec3(0.5))

然而,这提出了一个新问题:看看你是否可以重写你的选择算法,这样你就不必跳过所有的计算,而是在屏幕空间而不是世界空间中进行选择