我的問題是用OpenGL渲染文本 - 文本渲染成紋理,然後繪製到四邊形上。麻煩的是,紋理邊緣上的像素被繪製爲部分透明。紋理的內部很好。我使用NEAREST(非)插值計算紋理座標來命中我的紋理元素的中心,設置紋理環繞爲CLAMP_TO_EDGE,並設置投影矩陣將我的頂點放置在視口像素的中心。仍然看到這個問題。不透明的OpenGL紋理有透明邊框
我正在使用他們的紋理實用程序在VTK上工作。這些是用來加載紋理GL調用,用調試器逐句通過決定:
glGenTextures(1, &id);
glBindTexture(GL_TEXTURE_2D, id);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// Create and bind pixel buffer object here (not shown, lots of indirection in VTK)...
glTexImage2D(GL_TEXTURE_2D, 0 , GL_RGBA, xsize, ysize, 0, format, GL_UNSIGNED_BYTE, 0);
// Unbind PBO -- also omitted
glBindTexture(GL_TEXTURE_2D, id);
glAlphaFunc (GL_GREATER, static_cast<GLclampf>(0));
glEnable (GL_ALPHA_TEST);
// I've also tried doing this here for premultiplied alpha, but it made no difference:
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
渲染代碼:
float p[2] = ...; // point to render text at
int imgDims[2] = ...; // Actual dimensions of image
float width = ...; // Width of texture in image
float height = ...; // Height of texture in image
// Prepare the quad
float xmin = p[0];
float xmax = xmin + width - 1;
float ymin = p[1];
float ymax = ymin + height - 1;
float quad[] = { xmin, ymin,
xmax, ymin,
xmax, ymax,
xmin, ymax };
// Calculate the texture coordinates.
float smin = 1.0f/(2.0f * (imgDims[0]));
float smax = (2.0 * width - 1.0f)/(2.0f * imgDims[0]);
float tmin = 1.0f/(2.0f * imgDims[1]);
float tmax = (2.0f * height - 1.0f)/(2.0f * imgDims[1]);
float texCoord[] = { smin, tmin,
smax, tmin,
smax, tmax,
smin, tmax };
// Set projection matrix to map object coords to pixel centers
// (modelview is identity)
GLint vp[4];
glGetIntegerv(GL_VIEWPORT, vp);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
float offset = 0.5;
glOrtho(offset, vp[2] + offset,
offset, vp[3] + offset,
-1, 1);
// Disable polygon smoothing. Why not, I've tried everything else?
glDisable(GL_POLYGON_SMOOTH);
// Draw the quad
glColor4ub(255, 255, 255, 255);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, points);
glTexCoordPointer(2, GL_FLOAT, 0, texCoord);
glDrawArrays(GL_QUADS, 0, 4);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
// Restore projection matrix
glMatrixMode(GL_PROJECTION);
glPopMatrix();
出於調試目的,我已經覆蓋了最texels帶有紅色,下一個帶有綠色的texels內層(否則很難看到大部分白色文本圖像中發生了什麼)。
我使用gdeBugger檢查了內存中的紋理,它看起來和預期的一樣 - 紋理區域周圍的明亮的紅色和綠色邊框(額外的空白區域是填充以使其大小爲2的冪)。供參考:
這裏的最終渲染圖像的樣子(放大20倍 - 黑色像素是被下調試邊框呈現的文本的遺蹟)。淡紅色的邊框,但仍然是一個大膽的綠色的內邊框:
所以它只是受影響的像素的外緣。我不確定是混色還是阿爾法混合,這是搞砸的事情,我不知所措。我注意到,角落像素是邊緣像素的兩倍蒼白,也許這是重要的......也許有人在這裏可以發現錯誤?
如果某物顯示爲「透明」,則必須是因爲混合模式。那麼你在用什麼混合模式? – 2013-02-08 21:27:05
另外,你說你正在使用CLAMP_TO_EDGE等等,但你不顯示代碼。你確定你設置正確嗎? – 2013-02-08 21:28:18
我正在使用VTK並使用它們的紋理類,所以我省略了大部分。我回去完成紋理初始化,並將GL調用添加到帖子中。我現在省略的唯一部分是PBO的初始化,這不應該成爲一個問題,因爲數據正在上傳到圖形內存而沒有問題(如gDEBugger截圖所證明的那樣)。 – dlonie 2013-02-08 22:32:10