2013-06-26 56 views
2

我正在写一个地形引擎,其中有很多大型纹理覆盖在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); 
+0

你可以发布你的代码吗?也许不是全部,但至少是一个重现你的问题的最小例子。主要是,你的渲染循环和纹理设置代码可能是有用的。 –

回答

1

加速该代码的第一种方式是摆脱20年前的所有函数并将其转换为着色器。固定流水线在现代硬件上可能非常不理想,并且不断向GPU发送数据也可能会影响性能。记住

熊,我使用freeglut等我,​​而仅限于OpenGL的2

不,这不是真的。 Freeglut主要关注窗口和上下文创建,您仍然可以使用GLLoad或GLEW来获取OGL 3.x或4.x函数。

的事情,我看到的快速列表:

  • 固定管道的状态下使用glColor
  • 没有VBO使用/用废弃的glVertexPointer
  • 也许FBO应当用于最初填充纹理相结合?
+0

谢谢。该列表非常有用。迄今为止还没有使用GLEW之类的东西,所以必须做出这样的举动! – rspencer

+0

我认为你的意思是PBO(注意'P'如在Papa中),而不是用于纹理数据上传的FBO。 – datenwolf

相关问题