C 通过更改三角形大小更改OpenGL纹理坐标

C 通过更改三角形大小更改OpenGL纹理坐标,c,opengl,textures,texture-mapping,texture2d,C,Opengl,Textures,Texture Mapping,Texture2d,我对OpenGL的纹理贴图有问题 (1) 就是纹理。我想用一个三角形来表示这个 (2) 仅用于描述,纹理分割为三角形 (3) 将纹理映射到三角形16x16(高度x宽度) (4) 变形三角形的映射错误(如果三角形大小不是16x16) 对于(4),仅设置变量H1、H2、H3、H4(参见第二个代码框) 设置 //- setup cam / OpenGL int width = 1024; int height = 800; glViewport(0, 0, width, height); glMa

我对OpenGL的纹理贴图有问题


(1) 就是纹理。我想用一个三角形来表示这个
(2) 仅用于描述,纹理分割为三角形
(3) 将纹理映射到三角形16x16(高度x宽度)
(4) 变形三角形的映射错误(如果三角形大小不是16x16)

对于(4),仅设置变量H1、H2、H3、H4(参见第二个代码框)

设置

//- setup cam / OpenGL
int width = 1024;
int height = 800;

glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.f, width, 0.f, height, 1.f, -1.f);

glMatrixMode(GL_MODELVIEW);
glEnable(GL_TEXTURE_2D);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

...

//- texture position in texture [Value range: 0..1]
float textX1 = 0.f;
float textY1 = 0.f;

//- size of texture triangle
const float textSizeWidth = 16.0f / getTextureWidth(); //- getTextureWidth()=2^N !
const float textSizeHeight = 16.0f / getTextureHeight();//- getTextureHeight()=2^M !
const float textSizeWidthHalf = textSizeWidth * 0.5f;

//- output screen coordinates [Value range: 0.. N !!]
int outX = 0;
int outY = 0;


//- the heigh of one "line"
static const int YSTEP = 9;
绘制三角形

//-> cal: outX, outY, textX1, textY1, textX2, textY2 

//-  deformation values
unsigned int H1 = l->AraeHeight1;
unsigned int H2 = l->AraeHeight2;
unsigned int H3 = l->AraeHeight3;
unsigned int H4 = l->AraeHeight4;

//- disable the Height/deformation
if (!m_useHeight) H1 = H2 = H3 = H4 = 0;


//--      1 --- 4  ^
//--     / \ B /   |
//--    / A \ /    |YSTEP
//--   2 --- 3     v

////// A /////
//-- ->1
glTexCoord2f(textX1 + textSizeWidthHalf, textY1 + textSizeHeight);
glVertex3i(outX + 8, outY + YSTEP + H1, 0);

//-- ->2
glTexCoord2f(textX1, textY1);
glVertex3i(outX, outY + H2, 0);


//-- ->3
glTexCoord2f(textX1 + textSizeWidth, textY1);
glVertex3i(outX + 16, outY + H3, 0);


////// B /////
//-- ->1
glTexCoord2f(textX2, textY2 + textSizeHeight);
glVertex3i(outX + 8, outY + YSTEP + H1, 0);

//-- ->3
glTexCoord2f(textX2 + textSizeWidthHalf, textY2);
glVertex3i(outX + 16, outY + H3, 0);

//-- ->4
glTexCoord2f(textX2 + textSizeWidth, textY2 + textSizeHeight);
glVertex3i(outX + 8 + 16, outY + YSTEP + H4, 0);

如果H1=H2=H3=H4=0;然后一切看起来都很好(图(3))。如果不是的话,我会遇到渲染问题(图(4)),就像一个“取整”问题,但我不知道在哪里/为什么。或者问题是,纹理向右移动了一个像素,但是为什么呢?或者我需要设置另一个Open Gl参数。谢谢你的提示。

这是不可避免的,这是一个光栅化规则,后来是一个过滤规则(从碎片坐标取整UV),在这种情况下,人们通常只对蓝色像素的纹理进行放大,这意味着为每个足够靠近彩色区域的蓝色像素复制最近的彩色像素。

到底是什么问题?出现的蓝线?否则,纹理贴图在我看来还可以。或者你希望它看起来怎么样?是的。。。当我变形三角形时,三角形边缘的蓝线(这是纹理外部的像素)就会出现。