OGL纹理坐标计算和纹理边框颜色环绕模式过滤方法

来源:互联网 发布:网络教育英语作文 编辑:程序博客网 时间:2024/06/05 14:38
必须为物体分配顶点坐标和纹理坐标,顶点坐标决定在屏幕上的那个位置渲染那个顶点,纹理坐标决定了纹理图像中的那个纹理单元将分配给这个顶点( 光栅化时候顶点处理和像素处理汇合 ),然后插值纹理坐标,进行fragment shader用纹理单元为片段着色。

手动分配纹理坐标

glTexCoord4f (GLfloat s, GLfloat t, GLfloat r, GLfloat q);
例如:
glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0);
1)纹理坐标可以由s,t,r和q组成,以便和物体的(x,y,z,w)坐标和求值器的(u,v)进行区分。
s,t用于二维纹理,s,t,r用于三维纹理,q和物体的w坐标类似,用于和四维矩阵计算。
2)在进行纹理贴图之前,纹理坐标值与一个4x4矩阵相乘,注意整型的纹理坐标是直接使用的,而不是像普通的顶点坐标一样被映射到[-1,1]的范围之内。
3)在不规则的多边形上,也就是宽高比和纹理不一样,那么纹理会产生扭曲,那么就需要纹理坐标给出合适的宽高比,比如按照高度适配或者宽度适配(因为纹理要完全适配整个物体矩形,那么将按照物体矩形的宽高比进行截取或填充,然后进行等比拉伸;UI屏幕的适配类似但有不同,因为UI适配的物体矩形是可以变化的,因为是在屏幕区域上的适配,而不是物体上的)。把纹理图像映射到多边形模拟的曲面需要相当程度的艺术想象力(拆分,微分,组合的数学模型)。

自动生成纹理坐标

计算纹理坐标所在的坐标系指定:
glTexGeni (GLenum coord, GLenum pname, GLint param);
计算纹理坐标所相对于的平面指定:
glTexGenfv (GLenum coord, GLenum pname, const GLfloat *params);
启用需要计算的纹理坐标:
glEnable(GL_TEXTURE_GEN_S);
例如:
static GLfloat currentCoeff[] = {1.0, 0.0, 0.0, 0.0};
// 模型空间
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
// 相对于物体平面, 平面的系数由currentCoeff指定,生成的坐标是物体到平面的距离
glTexGenfv(GL_S, GL_OBJECT_PLANE, currentCoeff);
// 一个维度,计算s坐标
glEnable(GL_TEXTURE_GEN_S);
生成的纹理坐标 = p1x0 + p2y0 + p3z0 + p4w0
p向量是平面系数; x0,y0,z0,w0是物体的顶点坐标
一般开发中是在3ds max中导出物体的纹理坐标系。

纹理边框颜色

static GLfloat borderColor[] = {1.0, 0.0, 0.0, 0.0};
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_BORDER_COLOR, borderColor);

环绕模式S,T,R方向的,重复或截取

#define GL_TEXTURE_WRAP_S 0x2802
#define GL_TEXTURE_WRAP_T 0x2803
#define GL_CLAMP 0x2900
#define GL_REPEAT 0x2901
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);

过滤方法,放大过滤,缩小过滤;最近采样或线性采样(附近4个像素权重计算一个)

#define GL_NEAREST 0x2600
#define GL_LINEAR 0x2601
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

纹理优先级用于常驻GPU纹理调度策略

GL_TEXTURE_PRIORITY

传统的生成mipmap

#define GL_GENERATE_MIPMAP 0x8191
#define GL_GENERATE_MIPMAP_HINT 0x8192

mipmap时候选择层级,或层级下各个分辨率的图像的上下限层使用

#define GL_TEXTURE_MIN_LOD 0x813A
#define GL_TEXTURE_MAX_LOD 0x813B
#define GL_TEXTURE_BASE_LEVEL 0x813C
#define GL_TEXTURE_MAX_LEVEL 0x813D

纹理用于阴影

#define GL_DEPTH_TEXTURE_MODE 0x884B

纹理着色相关函数,颜色乘以标量,颜色相加,颜色相乘,各种组合

#define GL_TEXTURE_COMPARE_MODE 0x884C
#define GL_TEXTURE_COMPARE_FUNC 0x884D
0 0
原创粉丝点击