GLUT 纹理人工制品
GLUT textures artefacts
我正在尝试使用以下方法将纹理渲染到平面:
unsigned char image[HEIGHT][WIDTH][3];
...
GLuint textureId;
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D,
0,
GL_RGB,
WIDTH, HEIGHT,
0,
GL_RGB,
GL_UNSIGNED_BYTE,
image);
...
draw();
并且该代码 运行 很顺利,但是我打算在动态分配的数组 GLut 上执行此操作的地方正在渲染人工制品。短码:
unsigned char ***image;
image = new unsigned char**[HEIGHT];
for (int i = 0; i < HEIGHT; i++ )
{
image[i] = new unsigned char*[WIDTH];
for (int j = 0; j < WIDTH ; j++ )
{
image[i][j] = new unsigned char[3];
}
}
...
GLuint textureId;
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D,
0,
GL_RGB,
WIDTH, HEIGHT,
0,
GL_RGB,
GL_UNSIGNED_BYTE,
image);
...
draw();
两个数组的内容相同(逐位检查)。
完整代码:
main.cpp
http://pastebin.com/dzDbNgMa
TEXT_PLANE.hpp(使用headers,确保内联):
http://pastebin.com/0HxcAnkW
对于代码的混乱,我很抱歉,但这只是爆炸的一面。
如果有任何帮助,我将不胜感激。
您用作纹理的是从 image
开始的 WIDTH * HEIGHT * 3
字节内存。
为此,您需要像第一个示例中那样的连续数据。
您的第二个示例不是数组数组的数组,它是指向指针数组的指针数组。这些指针可以指向任何地方。
(数组不是指针,指针也不是数组。)
如果需要动态分配,使用
unsigned char image* = new unsigned char [WIDTH * HEIGHT * 3];
并进行自己的索引算法;组件将是
image[row * WIDTH + 3 * column]
image[row * WIDTH + 3 * column + 1]
image[row * WIDTH + 3 * column + 2]
(或
image[column * HEIGHT + 3 * row], etc.
选一个。)
我正在尝试使用以下方法将纹理渲染到平面:
unsigned char image[HEIGHT][WIDTH][3];
...
GLuint textureId;
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D,
0,
GL_RGB,
WIDTH, HEIGHT,
0,
GL_RGB,
GL_UNSIGNED_BYTE,
image);
...
draw();
并且该代码 运行 很顺利,但是我打算在动态分配的数组 GLut 上执行此操作的地方正在渲染人工制品。短码:
unsigned char ***image;
image = new unsigned char**[HEIGHT];
for (int i = 0; i < HEIGHT; i++ )
{
image[i] = new unsigned char*[WIDTH];
for (int j = 0; j < WIDTH ; j++ )
{
image[i][j] = new unsigned char[3];
}
}
...
GLuint textureId;
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D,
0,
GL_RGB,
WIDTH, HEIGHT,
0,
GL_RGB,
GL_UNSIGNED_BYTE,
image);
...
draw();
两个数组的内容相同(逐位检查)。 完整代码: main.cpp
http://pastebin.com/dzDbNgMa
TEXT_PLANE.hpp(使用headers,确保内联):
http://pastebin.com/0HxcAnkW
对于代码的混乱,我很抱歉,但这只是爆炸的一面。 如果有任何帮助,我将不胜感激。
您用作纹理的是从 image
开始的 WIDTH * HEIGHT * 3
字节内存。
为此,您需要像第一个示例中那样的连续数据。
您的第二个示例不是数组数组的数组,它是指向指针数组的指针数组。这些指针可以指向任何地方。
(数组不是指针,指针也不是数组。)
如果需要动态分配,使用
unsigned char image* = new unsigned char [WIDTH * HEIGHT * 3];
并进行自己的索引算法;组件将是
image[row * WIDTH + 3 * column]
image[row * WIDTH + 3 * column + 1]
image[row * WIDTH + 3 * column + 2]
(或
image[column * HEIGHT + 3 * row], etc.
选一个。)