2012-05-25 30 views
1

我正在研究字體生成解決方案並面臨紋理問題。我動態創建紋理圖集,然後用紋理座標映射每個字母。將紋理座標匹配到原始大小

這裏的映射「T」字母的結果:(生成的紋理是在上面,什麼我畫是對底部)

Problem 這似乎是問題是原始和紋理區域的該尺寸不匹配這就是爲什麼openGL試圖調整它的大小。我加載時,兩個閔和MAG使用GL_NEAREST /渲染質感

這裏的渲染代碼:

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]); 
+0

你能澄清問題是什麼嗎?我不確定我應該從這個圖像中拿走什麼。 – Tim

+0

只看圖像底部的't'字母和頂部的't'字母 –

回答

2

你的問題源於一個常見的誤解,OpenGL如何處理紋理座標。

紋理座標0和1不在像素中心上!

紋理實際上是多維採樣器,紋理數據爲採樣器插值提供支持。現在這種採樣方式對紋理座標映射有一些限制。一個邊界條件是,支持點應沿維度等距離。現在請記住,OpenGL支持紋理換行。

你的圖像基本上是一個柵格,一個樣方網格,稱爲像素。假設你在一排

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

拿到8個像素紋理座標

|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 

然而,在文本的情況下,更一般的渲染你罕要過濾的紋理;如果你縮小柵格化的字形,結果會看起來很弱,放大柵格化的字形鬆散的crispnes或得到別名。

如果您想使用固定功能管線,那麼紋理矩形非常適合這種情況。在稍後要求使用着色器的OpenGL版本(3及以上)中,有一種特殊的紋理採樣函數,它接受絕對紋理指標而不是採樣器插值座標。他們中的任何一個都非常適合這項任務。

而且你應該使用矢量紋理距離地圖,那麼你的樣品glyps的方式是完全不同的反正。

+0

謝謝,真的有幫助! –

+0

快速更正 - fencepost問題的一般解決方案是(2i + 1)/(2N)' – dlonie

+0

@dlonie:謝謝,修復它 – datenwolf