0
后续问题:纹理不循环显示
我需要为宗教组织设置不同的活动纹理?这可能是原因,因为我没有考虑到这一点。无论哪种方式,我的活动纹理都有问题。如果我在此之前将活动纹理设置为TEXTURE_1,则确实会得到该对象的纹理(但是是错误的)。
for (int side = 0; side < 2; side++) { glPushAttrib(GL_ALL_ATTRIB_BITS); glBindTexture(GL_TEXTURE_2D, 0); // Delete this line and a, wrong, texure pops up for the second iteration glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, modelsFboId[side]); glViewport(0,0,screenWidth,screenHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(SCREEN_FOV, SCREEN_RAT, NEAR, FAR); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glShadeModel(GL_SMOOTH); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); glDisable(GL_BLEND); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glDepthMask(true); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClearDepth(1.0f); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); camera.look(); drawObject(); glDisable(GL_DEPTH_TEST); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); glPopAttrib(); }
我圈了两个FBO的这两者都是在一个循环中创建。 fbo的工作很好,但纹理不想绑定的第二个迭代。我尝试在第二次迭代时切换到不同的活动纹理,我禁用了着色器,并尝试设置clientactivetexture。如果我跳过第一次迭代,第二次循环无效。当我附加颜色而不是纹理时,对象会显示(它根本不显示纹理边界)。
我试着追踪这个bug好两天,现在无济于事。
此外,在这个循环之后,我有第二个循环,除了它使用显示列表外,其他循环都是一样的,并且它对两次迭代都可以正常工作,这可能表明出现了一些问题。
for (int side = 0; side < 2; side++) {
modelsFboId[side] = glGenFramebuffersEXT();
modelsFboTextureId[side] = glGenTextures();
modelsDepthRenderBufferId[side] = glGenRenderbuffersEXT();
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, modelsFboId[side]);
glBindTexture(GL_TEXTURE_2D, modelsFboTextureId[side]);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, screenWidth, screenHeight, 0,GL_RGBA, GL_INT, (java.nio.ByteBuffer) null);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT,GL_TEXTURE_2D, modelsFboTextureId[side], 0);
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, modelsDepthRenderBufferId[side]);
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, screenWidth, screenHeight);
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,GL_DEPTH_ATTACHMENT_EXT,GL_RENDERBUFFER_EXT, modelsDepthRenderBufferId[side]);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}
drawObject():
// using bind slick, texture int doesn't change in this function nor any other
if (textureMode == 1) {
glColor3f(color.x, color.y, color.z);
} else if (textureMode == 0) {
glColor3f(1.0f, 1.0f, 1.0f);
glEnable(GL_TEXTURE_2D);
textures[texture].bind();
}
glPushMatrix();
..rotations.. all seems definitely fine here and certainly doesn't change in correspondence to the prev iteration.
.. draw actual object.. tried LWJGL sphere, a simple cube and some other LWJGL objects
glPopMatrix();
if (textureMode == 0)
glDisable(GL_TEXTURE_2D);
阵列inits ..
int skyFboId[] = {-1, -1};
int skyFboTextureId[] = {-1, -1};
int modelsFboId[] = {-1, -1};
int modelsFboTextureId[] = {-1, -1};
int modelsDepthRenderBufferId[] = {-1, -1};
int listModelsFboId[] = {-1, -1};
int listModelsFboTextureId[] = {-1, -1};
int listModelsDepthRenderBufferId[] = {-1, -1};
int listModelsTextureLocation = -1;
问题是什么?如果第二个循环有效,为什么不使用它? (虽然它看起来没有上传任何纹理数据 - 所以不知道它是如何工作的。)另外,你的第一个循环是一团糟。它正在做很多不必要的工作 - 你多次设置视口;你启用texture2D,不使用它,然后禁用它;将模型视图矩阵设置为两次。最重要的是,你永远不会设置你想要吸取的FBO。可能会退后一步,确保您了解每个调用的打算,然后通过逐步调试并确保每条线路都能正常工作。 – user1118321 2013-02-17 16:15:55
是的,这是一团糟!抱歉!我是Opengl的新手,随时学习。然而,我知道每次通话都会做什么,但我不能确定何时需要给他们打电话。我会立即开始深入研究。但是,我认为这个开销不会是一个问题(?)。我知道纹理已正确上传,因为它在第一次迭代中显示,而不是在第二次迭代中显示。我需要第一个循环不是显示列表,因为它每帧更新一次,使用列表会减慢它。 – RobotRock 2013-02-17 16:36:33
清理了一下。 – RobotRock 2013-02-17 16:54:16