纹理采样
在opengl和directx里有纹理采样函数vector4 Sampler.texture2d(float s,float t),用它可以取得对应纹理坐标的纹理值;然而,并不知道这个函数的具体实现是怎么样的.事实上从图像读取的纹理就是一个数组,类似这样:
imgData=new unsigned char[width*height*3];
纹理坐标可以转换为数组的下标,类似这样:
float u=(float)(width-1)*s;
float v=(float)(height-1)*(1.0-t);
int iu=(int)u;
int iv=(int)v;
纹理坐标s和t的范围是0到1,这边采用的是opengl的坐标系,y轴从下到上递增,但是图片保存的坐标系y轴是从上到下递增,所以1.0-t做y轴取反以获得opengl坐标系的对应的纹理坐标,这边运算出的u和v的范围是0到纹理宽和0到纹理高,然后将v乘以纹理宽加上u然后乘以3(一个纹理包含rgb分量)即可获得数组下标:
int imgIndex=3*(iv*width+iu);
最后通过数组下标取得对应的纹理值:
color.x=(float)imgData[imgIndex]*INV_SCALE;
color.y=(float)imgData[imgIndex+1]*INV_SCALE;
color.z=(float)imgData[imgIndex+2]*INV_SCALE;