English 中文(简体)
原始大小的匹配纹理坐标
原标题:Match texture coordinates to primitive size

我正在研究字体生成解决方案, 并面对质地问题。 我将动态地创建质地图集, 然后用它们的质地坐标绘制每封信的图示 。

这里映射“ t” 字母的结果 :( 生成的纹理在顶部, 我画的在底部)

Problem It seem that the issue is that size of the primitive and texture region is not matching that s why openGL trying to resize it. I m using GL_NEAREST on both Min and Mag when loading / rendering texture

此处的转换代码如下:

glBegin(GL_TRIANGLE_STRIP);

float twidth = 7.f / 512.f;
float theight = 11.f / 512.f;

float width = 7.f;
float height = 11.f;

float w = width / 2.f;
float h = height / 2.f;

float x = 100;
float y = 100;

float tx = 135.f / 512.f;
float ty = 0;

glTexCoord2f(tx, ty);
glVertex2f(x - w, y-h);

glTexCoord2f(tx + twidth, ty);
glVertex2f(x + w, y-h);

glTexCoord2f(tx, ty + theight);
glVertex2f(x - w, y+h);

glTexCoord2f(tx + twidth, ty + theight);
glVertex2f(x + w, y+h);

glEnd();

这里的初始化代码 :

glViewport(0,0,width,height);       

glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);   

// Set up the GL state.
glClearColor(1, 1, 1, 1);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);


//glDisable(GL_BLEND);
glEnable(GL_BLEND);
glEnable(GL_TEXTURE_2D);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glOrtho(0, width, height, 0, -1, 1);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

纹理装入代码 :

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);


    glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, 512, 512,
        0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, &texBinary[0]);
最佳回答

您的问题源于对 OpenGL 处理纹理坐标的常见误解。

纹理坐标 0 和 1 不在像素中心!

纹理其实是多维样本,而纹理数据为取样器的内插提供了支持。现在,这种取样工作的方式对纹理协调绘图设置了一些限制。一个边界条件是,支持点在维度上应该相等。现在请记住 OpenGL 支持纹理包装。

您的图像基本上是一个光栅, 由二次方格组成的网格, 叫做像素。 假设您连续有八种像素 。

   |0|1|2|3|4|5|6|7|

纹理坐标是

   |0|1|2|3|4|5|6|7|
   ^               ^
  0.0             1.0

这是众所周知的栅栏柱问题。 您的像素中心实际上是在纹理坐标处 。

(0/8 + 1/8)/2, (1/8 + 2/8)/2, …, (7/8 + 8/8)/2

或更一般的或 比较一般的

(2i + 1)/2N

然而,如果文本使您很少想过滤您的纹理;如果您将光晶化的晶体微字放大,结果将显得软弱,放大光化的晶体松散或被化名。

如果您想要使用固定功能管道, 则纹理矩形完全适合本案。 稍后的 OpenGL 版本要求使用阴影器( 3 和 3 以上 ), 有一种特殊的纹理取样功能, 接受绝对的 Texel 指数, 而不是取样器内插坐标 。 其中任何一个都完全适合任务 。

如果您使用 Vector Textures Disstantance Maps , 那么您样样样 glyps 的方式就完全不同了 。

问题回答

暂无回答




相关问题
OpenGL ES iPhone - drawing anti aliased lines

Normally, you d use something like: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glEnable(GL_LINE_SMOOTH); glLineWidth(2.0f); glVertexPointer(2, GL_FLOAT, 0, points); ...

iPhone: Quartz2d vs. OpenGL ES

OK, I m still brand new to iPhone development. I have a free game on the app store, Winner Pong, but it s just a Pong clone (who would ve guessed) that uses the standard UIImageViews for the sprites. ...

GLPaint with white background

I m trying draw on a white background by reverse engineering GLPaint. I ve gone through every combination of kSaturation, kLuminosity and glBlendFunc, AND just about every combination I can think of ...

OpenGL ES - how to keep some object at a fixed size?

I m working on a little game in OpenGL ES. In the background, there is a world/map. The map is just a large texture. Zoom/pinch/pan is used to move around. And I m using glOrthof (left, right, bottom,...

Any free polygon library for the iPhone?

I need a library that can manage polygon modeling and basic transformation like rotating and translating. I d rather not redevelop everything from scratch Thanks