Opengl 使用GLSL实现多维数据集映射
我目前正在使用一些着色器代码,但其中一些代码让我感到困惑。 它使用传入的gl_顶点计算出eyevector,然后再选择vector。最后传递到frag着色器。通过frag着色器,通过textureCube提取纹理。我的问题是,每个gl_顶点是否只有一个像素?这些着色器的插值发生在哪里Opengl 使用GLSL实现多维数据集映射,opengl,glsl,Opengl,Glsl,我目前正在使用一些着色器代码,但其中一些代码让我感到困惑。 它使用传入的gl_顶点计算出eyevector,然后再选择vector。最后传递到frag着色器。通过frag着色器,通过textureCube提取纹理。我的问题是,每个gl_顶点是否只有一个像素?这些着色器的插值发生在哪里 vertex shader: uniform vec4 eyepos; varying vec3 reflectvec; void main(void) { vec4 p
vertex shader:
uniform vec4 eyepos;
varying vec3 reflectvec;
void main(void) {
vec4 pos = normalize(gl_ModelViewMatrix * gl_Vertex);
pos = pos / pos.w;
vec3 eyevec = normalize(eyepos.xyz - pos.xyz);
vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
reflectvec = reflect(-eyevec, norm);
gl_Position = ftransform();
}
frag shader:
uniform samplerCube cubemap;
varying vec3 reflectvec;
void main(void) {
vec4 texcolor = textureCube(cubemap, reflectvec);
gl_FragColor = texcolor;
}
这些着色器的插值发生在哪里
vertex shader:
uniform vec4 eyepos;
varying vec3 reflectvec;
void main(void) {
vec4 pos = normalize(gl_ModelViewMatrix * gl_Vertex);
pos = pos / pos.w;
vec3 eyevec = normalize(eyepos.xyz - pos.xyz);
vec3 norm = normalize(gl_NormalMatrix * gl_Normal);
reflectvec = reflect(-eyevec, norm);
gl_Position = ftransform();
}
frag shader:
uniform samplerCube cubemap;
varying vec3 reflectvec;
void main(void) {
vec4 texcolor = textureCube(cubemap, reflectvec);
gl_FragColor = texcolor;
}
对每个片段执行片段着色器。一个像素至少由一个片段组成。在顶点和片段着色器之间,朝向片段着色器的输入变量是重心插值的。hi,@datenwolf谢谢。我似乎理解错了什么。顶点着色器将在每个顶点上执行,并计算出变化的vec3 reflectvec作为初始值。在光栅化过程中,GPU使用初始值进行插值,换句话说,使用顶点着色器中的可变变量,然后将插值传递给片段着色器生成的每个片段?是的,顶点着色器为每个顶点生成
reflectvec
。片段阶段然后在每个片段传递到片段着色器之前,在顶点之间插入reflectvec
和其他变量。thx@datenwolf,您能告诉我它是如何在两个变量之间插值的,甚至更多。@haohaochao:这些值是重心插值的(谷歌搜索重心插值,你会发现很多信息)。将三角形几何体转化为碎片并从中提取像素的过程称为光栅化(谷歌扫描线光栅化器,你会得到很多信息)。插值是通过对每个片段相对于变换顶点的视口坐标的位置进行重心计算来完成的。具体细节如何在代码中写入取决于OpenGL实现(即驱动程序和GPU),可能是商业秘密。您的#version
指令在哪里?