我是opengl的新手,并且能够自己学习很多东西,但我被困在这个问题上。我的OpenGL Cubemap使用了6个相同纹理的副本,而不是6个不同的纹理
我有一个房间渲染,但我需要一个球体在中心悬停反映了其他所有的完美。到目前为止,我已经能够以很好的结果对立方体进行立方体映射,但是6种纹理都是相同的:即我对房间的看法。我打电话给gluLookAt将相机重新定位到球体的位置,然后查看其周围环境,然后我调用glCopyTexImage2D以将其加载到适当的纹理中,但我无法加载6个不同的透视图。 ..只是一次,六次。
这里是有关的代码,如果你可以看看通过它帮助我,我会永远爱你:)
void drawReflectiveSphere(){
glEnable(GL_TEXTURE_CUBE_MAP);
float pos[] = {10.0, 1.0, -40.0};
float x_pos [] = {pos[0] + 1, pos[1], pos[2]};
float x_neg [] = {pos[0] - 1, pos[1], pos[2]};
float y_pos [] = {pos[0], pos[1] + 1, pos[2]};
float y_neg [] = {pos[0], pos[1] - 1, pos[2]};
float z_pos [] = {pos[0], pos[1], pos[2] + 1};
float z_neg [] = {pos[0], pos[1], pos[2] - 1};
float view_pos[][3] = {x_pos[0], x_neg[0], y_pos[0], y_neg[0], z_pos[0], z_neg[0]};
glGenTextures(1, &cubemap);
glReadBuffer(GL_BACK);
//Use different frustum
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glFrustum(-5.0, 5.0, -5.0, 5.0, 0.0, width + 10.0);
glMatrixMode(GL_MODELVIEW);
glViewport(0, 0, 128, 128);
//Generate cube map textures
for(int i = 0; i < 6; i++){
glPushMatrix();
gluLookAt(pos[0], pos[1], pos[2],
view_pos[i][0], view_pos[i][1], view_pos[i][2],
0.0, -1.0, 0.0);
glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, 0, 0, 128, 128, 0);
glPopMatrix();
}
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnable(GL_TEXTURE_GEN_S);
glEnable(GL_TEXTURE_GEN_T);
glEnable(GL_TEXTURE_GEN_R);
//Restore viewport
glViewport(0, 0, W, H);
//Draw cube-mapped sphere
glPushMatrix();
glTranslatef(pos[0], pos[1], pos[2]);
gluSphere(quadratic, 5.0f, 128, 128);
glPopMatrix();
//Restore projection matrix
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glDisable(GL_TEXTURE_GEN_S);
glDisable(GL_TEXTURE_GEN_T);
glDisable(GL_TEXTURE_GEN_R);
glDisable(GL_TEXTURE_CUBE_MAP);
}
好吧,如果我有一个render()方法绘制整个场景,我可以在我的gluLookAt()之后调用它,它会从每个新视角渲染并加载到纹理?另外,我应该从(如之前)绘制立方体贴图分开生成这些纹理? – jakev 2010-09-18 00:44:18
也...我会如何直接渲染我的纹理?我只是几乎不知道矩阵堆栈如何工作,这对我来说都是全新的。 – jakev 2010-09-18 00:53:04
@JakeVA要直接渲染到纹理,您需要使用帧缓冲区对象(FBO)。 – 2010-09-18 02:45:17