|
偶不懂CubeMap,
在看Samples中的HDRCubeMap代码,难度特大,
网上找了一份opengl的动态的CubeMap,粘贴上来,
求大大们翻译成directx的好么?
一个渲染到CubeMap的代码,因为要渲染六个面,所以场景要渲染六次, 所以动态CubeMap是十分需要性能的.
//Function to generate the cibemats for this frame
//PosX, PosY, PosZ 为需要采样的中心坐标,一般把他定在反射物体的中心.
const int CUBE_MAP_SIZE=64; //动态CubeMap的大小
void CreateCubeMap(GLfloat PosX, GLfloat PosY, GLfloat PosZ)
{
int i;
glViewport(0,0,CUBE_MAP_SIZE,CUBE_MAP_SIZE);
glScissor(0,0,CUBE_MAP_SIZE,CUBE_MAP_SIZE);
glEnable(GL_SCISSOR_TEST);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90,1,1,2000); //设定90度,每一面的图才能完整的拼在一起
glMatrixMode(GL_MODELVIEW);
for(i=0;i<=5;i++)
{
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
//渲染每个面到CubeMap上面去
switch(i)
{
case 0:
glRotatef( 90,0,1,0);
glRotatef(180,1,0,0);
break;
case 1:
glRotatef(-90,0,1,0);
glRotatef(180,1,0,0);
break;
case 2:
glRotatef(-90,1,0,0);
break;
case 3:
glRotatef( 90,1,0,0);
break;
case 4:
glRotatef(180,1,0,0);
break;
case 5:
glRotatef(180,0,0,1);
break;
}
glTranslatef(PosX,PosY,PosZ);
glScalef(-1,-1,-1);
RenderScene(); //渲染场景, 可以换成你自己的场景渲染函数
glEnable(GL_TEXTURE_CUBE_MAP_ARB);
glBindTexture(GL_TEXTURE_CUBE_MAP_ARB,CubeMap_TEX);
glCopyTexSubImage2D(CubeMap_define,0,0,0,0,0,CUBE_MAP_SIZE,CUBE_MAP_SIZE);
glDisable(GL_TEXTURE_CUBE_MAP_ARB);
}
//恢复以前的设置
//SCREEN_WIDTH,SCREEN_HEIGHT是当前OGL程序的水平,垂直分辨率.
glScissor(0,0,SCREEN_WIDTH,SCREEN_HEIGHT);
glDisable(GL_SCISSOR_TEST);
glResizeWnd(SCREEN_WIDTH,SCREEN_HEIGHT);
}
glResizeWnd是一段Delphi代码,很容易翻译成C++的
procedure glResizeWnd(Width, Height : Integer);
begin
if (Height = 0) then // prevent divide by zero exception
Height := 1;
SCREEN_WIDTH := Width;
SCREEN_HEIGHT := Height;
glViewport(0, 0, Width, Height); // Set the viewport for the OpenGL window
glMatrixMode(GL_PROJECTION); // Change Matrix Mode to Projection
glLoadIdentity(); // Reset View
gluPerspective(45.0, Width/Height, 1.0, 200.0); // Do the perspective calculations. Last value = max clipping depth
glMatrixMode(GL_MODELVIEW); // Return to the modelview matrix
glLoadIdentity(); // Reset View
end; |
|