opengl 我应该使用哪种矢量对立方体贴图进行采样?

3yhwsihp  于 2023-08-04  发布在  其他
关注(0)|答案(1)|浏览(90)

我想知道是否有人可以提供一些澄清。
我有一个立方体贴图,边长和高度都是8192像素。
我使用下面的向量(见下面的dir_vector)来采样我的立方体贴图,

#version 330 core

uniform vec3 hangle; // horizontal angular range and increment
uniform vec3 vangle; // vertical angular range and increment
out vec3 dir_vector;

void main(){
   for (float theta = vangle.x; theta < float(vangle.y); theta+= vangle.z){
       for (float psi = hangle.x;  psi <  float(hangle.y); psi+= hangle.z){
           float x = sin(radians(theta)) * sin(radians(psi));
           float z = cos(radians(theta)) * sin(radians(psi));
           float y = cos(radians(theta));
           dir_vector = vec3(x,y,z);
       }
   } 
}

字符集
很明显,dir_vector的长度将为1,x,y,z将在(-1.0,1.0)之内。
向量的长度是否需要更大?
我还假设给定dir_vector的坐标,opengl已经知道要采样立方体贴图的哪一侧。这个假设是否正确?

vecaoik1

vecaoik11#

很明显,dir_vector的长度将为1…
您的代码中有一个错误。如果你想从球坐标转换,那么y的公式应该是:

float y = cos(radians(psi));  // NOT theta

字符集
向量的长度是否需要更大?
否。OpenGL根据矢量的方向从立方体贴图中采样,忽略长度。
我还假设给定dir_vector的坐标,opengl已经知道要对立方体贴图的哪一侧进行采样。这个假设是否正确?
是的。OpenGL根据矢量的方向确定立方体贴图的面。

Cubemap采样

立方体贴图采样的详细信息在OpenGL spec的“8.13立方体贴图纹理选择”一节中描述。
简而言之:长轴是基于最大幅度的坐标来确定的。这将确定将要采样的立方体贴图面。其他两个坐标除以主坐标,得到[-1, 1]范围内的值,然后重新Map到[0, 1]纹理坐标,然后使用该坐标对该面的纹理进行采样,就像常规的2d纹理一样。
例如,给定输入向量(10, 20, 100),长轴是“正z”。OpenGL将计算

s = (10/100 + 1)/2 = 0.55
t = (-20/100 + 1)/2 = 0.40


并在坐标(s,t)处对GL_TEXTURE_CUBE_MAP_POSITIVE_Z面进行采样。在这个阶段,将考虑正确的mipmap级别,转换为实际的纹素索引。

相关问题