我正在写一个地形引擎,其中有很多大型纹理覆盖在heightmap上。这些纹理是通过渲染一堆东西,然后几次使用glCopyTexSubImage2D
命令生成的。我的第一个想法是,一些东西(GPU(图形处理器),GPU(图形处理器))和GPU(图形处理器)或CPU)必须在每次纹理渲染时都拉动所有像素,这肯定会减慢它的速度,所以我尝试了我认为的解决方案:实现mipmapping。很多大纹理都很慢。加快速度的最佳途径?
所以我把所有的RGB值到一个数组,再经过成gluBuild2DMipmaps
。 (这是不是浪费?我要求一些数据,然后马上给它,有没有更好的方法来做到这一点与我有(见下文))。
现在,中期遥远的纹理看起来很糟糕和乏味,我没有更好的速度前。
有没有什么方法可以在加速渲染的同时获得更多纹理的更多细节?请记住,我使用freeglut等我,而仅限于OpenGL的2
[编辑:一些代码示例]
生成纹理:
//Only executes once as then the texture is defined.
if (TextureNumber == -1)
{
glGenTextures (1, &TextureNumber);
glBindTexture(GL_TEXTURE_2D, TextureNumber);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
// ... Other not directly related stuff
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, TEXTURE_SIZE, TEXTURE_SIZE, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
}
//The texture is built up a little bit at a time, over a number of calls.
// Do some rendering
// ...
glBindTexture(GL_TEXTURE_2D, TextureNumber);
//And copy it into the big texture
glCopyTexSubImage2D (GL_TEXTURE_2D, 0, texX * _patch_size, texY * _patch_size, 0, 0, _patch_size, _patch_size);
最后,这种运行一次:
unsigned char* dat = new unsigned char [TEXTURE_SIZE*TEXTURE_SIZE*3];
glBindTexture(GL_TEXTURE_2D, TextureNumber);
glGetTexImage(GL_TEXTURE_2D,0,GL_RGB,GL_UNSIGNED_BYTE,dat);
gluBuild2DMipmaps(GL_TEXTURE_2D,3,TEXTURE_SIZE,TEXTURE_SIZE,GL_RGB,GL_UNSIGNED_BYTE,dat);
finishedTexture = true;
delete[] dat;
渲染:
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glColor3f(1,1,1);
glVertexPointer(3, GL_FLOAT, 0, VertexData);
glTexCoordPointer(2, GL_FLOAT, 0, TextureData);
glBindTexture(GL_TEXTURE_2D, TextureNumber);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glDrawElements(GL_TRIANGLES, //mode
numTri[detail], //count, ie. how many indices
GL_UNSIGNED_INT, //type of the index array
TriangleData[detail]);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
你可以发布你的代码吗?也许不是全部,但至少是一个重现你的问题的最小例子。主要是,你的渲染循环和纹理设置代码可能是有用的。 –