我想知道是否有人可以提供一些澄清。
我有一个立方体贴图,边长和高度都是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已经知道要采样立方体贴图的哪一侧。这个假设是否正确?
1条答案
按热度按时间vecaoik11#
很明显,dir_vector的长度将为1…
您的代码中有一个错误。如果你想从球坐标转换,那么
y
的公式应该是:字符集
向量的长度是否需要更大?
否。OpenGL根据矢量的方向从立方体贴图中采样,忽略长度。
我还假设给定dir_vector的坐标,opengl已经知道要对立方体贴图的哪一侧进行采样。这个假设是否正确?
是的。OpenGL根据矢量的方向确定立方体贴图的面。
Cubemap采样
立方体贴图采样的详细信息在OpenGL spec的“8.13立方体贴图纹理选择”一节中描述。
简而言之:长轴是基于最大幅度的坐标来确定的。这将确定将要采样的立方体贴图面。其他两个坐标除以主坐标,得到
[-1, 1]
范围内的值,然后重新Map到[0, 1]
纹理坐标,然后使用该坐标对该面的纹理进行采样,就像常规的2d纹理一样。例如,给定输入向量
(10, 20, 100)
,长轴是“正z”。OpenGL将计算型
并在坐标(s,t)处对
GL_TEXTURE_CUBE_MAP_POSITIVE_Z
面进行采样。在这个阶段,将考虑正确的mipmap级别,转换为实际的纹素索引。