openGL及GLSL的小知识

来源:互联网 发布:灰色模型软件 编辑:程序博客网 时间:2024/05/20 00:12

  • GLSL的变量的限定符的作用

uniform

表明是外部程序传递给顶点着色器和片段着色器的变量

attribute

表明是只能在顶点着色器使用的变量,用来表示顶点坐标,法线,纹理坐标

varying

表明是用于顶点着色器和片段着色器之间传递数据之用

  • openGL中纹理参数的设定
当我们绘制一个三角形时,只需要指定三个顶点的颜色。三角形中其它各点的颜色不需要我们指定,这些点的颜色是OpenGL自己通过计算得到的。在我们学习OpneGL光照时,法线向量、材质的指定,都是只需要在顶点处指定一下就可以了,其它地方的法线向量和材质都是OpenGL自己通过计算去获得。纹理的使用方法也与此类似。只要指定每一个顶点在纹理图象中所对应的像素位置,OpenGL就会自动计算顶点以外的其它点在纹理图象中所对应的像素位置。而纹理参数就是设定怎样把几何图元上除顶点以外的点对应到纹理贴图上。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

指当纹理图象被使用到一个大于它的曲面上时(即:有可能纹理图象中的一个像素会被应用到实际绘制时的多个像素。例如将一幅256*256的纹理图象应用到一个512*512的正方形),把纹理图像拉伸到和曲面一样大,并盖上去,使用最接近的一个纹素的颜色(即覆盖此像素的纹素颜色)作为需要贴图的像素颜色。这种方式速度快,视觉效果差,可以用来产生shadow map。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

指当纹理图象被使用到一个大于它的曲面上时(即:有可能纹理图象中的一个像素会被应用到实际绘制时的多个像素。例如将一幅256*256的纹理图象应用到一个512*512的正方形),把纹理图像拉伸到和曲面一样大,并盖上去,使用纹理中坐标最接近的若干个颜色(即覆盖此像素的纹素颜色及其周围的纹素颜色),通过加权平均算法得到需要绘制的像素颜色。这种方式速度慢,但视觉效果好。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

指当纹理图象被使用到一个小于它的曲面上时(即:有可能纹理图象中的一个像素会被应用到实际绘制时的多个像素。例如将一幅256*256的纹理图象应用到一个512*512的正方形),把纹理图像拉伸到和曲面一样大,并盖上去,使用最接近的一个纹素的颜色(即覆盖此像素面积最大的纹素颜色)作为需要贴图的像素颜色。这种方式速度快,视觉效果差,可以用来产生shadow map。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

指当纹理图象被使用到一个小于它的曲面上时(即:有可能纹理图象中的一个像素会被应用到实际绘制时的多个像素。例如将一幅256*256的纹理图象应用到一个512*512的正方形),把纹理图像缩小到和曲面一样大,并盖上去,使用纹理中坐标最接近的若干个颜色(即覆盖此像素的几个纹素颜色),通过加权平均算法得到需要绘制的像素颜色。这种方式速度慢,但视觉效果好。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);//设定纹理坐标的第一个分量
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);//设定纹理坐标的第二分量

指当纹理坐标的第一维坐标值大于1.0或小于0.0时,应该“截断”,即超过1.0的按1.0处理,不足0.0的按0.0处理。例如:某二维纹理,在绘制某形状时,一像素需要得到纹理中坐标为(3.5, 0.5)的像素的颜色,其中第一维的坐标值3.5超过了1.0,则在GL_CLAMP方式中将被转化为(1.0, 0.5)。如果不指定这个参数,则默认为GL_REPEAT。

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);//设定纹理坐标的第一个分量
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);//设定纹理坐标的第二分量
指当纹理坐标的第一维坐标值大于1.0或小于0.0时,应该“重复”,即对坐标值加上一个合适的整数(可以是正数或负数),得到一个在[0.0, 1.0]范围内的值,然后用这个值作为新的纹理坐标。例如:某二维纹理,在绘制某形状时,一像素需要得到纹理中坐标为(3.5, 0.5)的像素的颜色,其中第一维的坐标值3.5超过了1.0,在GL_REPEAT方式中将被转化为(0.5, 0.5)。如果不指定这个参数,则默认为GL_REPEAT。