working : i’m using 3 textures (unit 0,1,2), blending them together with coverage factors stored in texture unit 5, combining with a noise texture (unit 4) and a basetex (unit 3).
all objects are depth-sorted (nearest first)
all near objects, those which use the first 3 textures, are 100% bright (lighting doesn’t affect them).
the rest is fine.
if i disable the 3 detailtextures at the beginning, the light affects NOTHING…everything bright.
it seems that it’s nessesary to draw something, then disable some texture units, and then, the lighting works…
maybe i’m not seeing a stupid bug
here’s the code (pretty long, but pretty simple)
private void setCoverMode() {
float TexCoordX = {0.5f, 0.0f, 0, 0.0f};
float TexCoordY = {0, 0.0f, 0.5f, 0.0f};
float TexCoordX2 = {0.5f, 0.0f, 0, 0.0f};
float TexCoordY2 = {0, 0.0f, 0.5f, 0.0f};
float TexCoordX3 = {0.4f, 0.0f, 0, 0.0f};
float TexCoordY3 = {0, 0.0f, 0.4f, 0.0f};
float TexCoordX4 = {1f / (mapSize * mapScaleFactor), 0, 0f, 0.0f};
float TexCoordY4 = {0, 0f, 1f / (mapSize * mapScaleFactor), 0.0f};
float TexCoordX5 = {0.03f, 0.0f, 0, 0.0f};
float TexCoordY5 = {0, 0.0f, 0.03f, 0.0f};
//landscape//tex2 - stonedetail gl.glActiveTextureARB(GL_TEXTURE2_ARB); gl.glEnable(GL_TEXTURE_2D); gl.glBindTexture(GL_TEXTURE_2D, texture[earthDetailTex]); gl.glEnable(GL_TEXTURE_GEN_S); gl.glEnable(GL_TEXTURE_GEN_T); gl.glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); gl.glTexGenfv(GL_S, GL_OBJECT_PLANE, TexCoordX3); gl.glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); gl.glTexGenfv(GL_T, GL_OBJECT_PLANE, TexCoordY3); gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_COMBINE_ARB); gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_COMBINE_RGB_ARB, gl.GL_INTERPOLATE_ARB); gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_SOURCE0_RGB_ARB, gl.GL_PREVIOUS_ARB); gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_OPERAND0_RGB_ARB, gl.GL_SRC_COLOR); gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_SOURCE1_RGB_ARB, gl.GL_TEXTURE); gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_OPERAND1_RGB_ARB, gl.GL_SRC_COLOR); gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_SOURCE2_RGB_ARB, gl.GL_TEXTURE5_ARB); gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_OPERAND2_RGB_ARB, gl.GL_SRC_ALPHA); //gl.glCallList(displayList[0]); //tex1 - grasdetail gl.glActiveTextureARB(GL_TEXTURE1_ARB); gl.glEnable(GL_TEXTURE_2D); gl.glBindTexture(GL_TEXTURE_2D, texture[grasDetailTex]); gl.glEnable(GL_TEXTURE_GEN_S); gl.glEnable(GL_TEXTURE_GEN_T); gl.glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); gl.glTexGenfv(GL_S, GL_OBJECT_PLANE, TexCoordX2); gl.glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); gl.glTexGenfv(GL_T, GL_OBJECT_PLANE, TexCoordY2); gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_COMBINE_ARB); gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_COMBINE_RGB_ARB, gl.GL_INTERPOLATE_ARB); gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_SOURCE0_RGB_ARB, gl.GL_PREVIOUS_ARB); gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_OPERAND0_RGB_ARB, gl.GL_SRC_COLOR); gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_SOURCE1_RGB_ARB, gl.GL_TEXTURE); gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_OPERAND1_RGB_ARB, gl.GL_SRC_COLOR); gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_SOURCE2_RGB_ARB, gl.GL_TEXTURE5_ARB); gl.glTexEnvi(gl.GL_TEXTURE_ENV, gl.GL_OPERAND2_RGB_ARB, gl.GL_SRC_COLOR); //gl.glCallList(displayList[0]); //tex0 - earthdetail gl.glActiveTextureARB(GL_TEXTURE0_ARB); gl.glEnable(GL_TEXTURE_2D); gl.glBindTexture(GL_TEXTURE_2D, texture[stoneDetailTex]); gl.glEnable(GL_TEXTURE_GEN_S); gl.glEnable(GL_TEXTURE_GEN_T); gl.glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); gl.glTexGenfv(GL_S, GL_OBJECT_PLANE, TexCoordX); gl.glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); gl.glTexGenfv(GL_T, GL_OBJECT_PLANE, TexCoordY); gl.glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); //basistextur gl.glActiveTextureARB(GL_TEXTURE3_ARB); gl.glEnable(GL_TEXTURE_2D); gl.glBindTexture(GL_TEXTURE_2D, texture[worldTex]); gl.glEnable(GL_TEXTURE_GEN_S); gl.glEnable(GL_TEXTURE_GEN_T); gl.glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); gl.glTexGenfv(GL_S, GL_OBJECT_PLANE, TexCoordX4); gl.glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); gl.glTexGenfv(GL_T, GL_OBJECT_PLANE, TexCoordY4); gl.glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); //tex4 - noise texture gl.glActiveTextureARB(GL_TEXTURE4_ARB); gl.glEnable(GL_TEXTURE_2D); gl.glBindTexture(GL_TEXTURE_2D, texture[randomnoiseTex]); gl.glEnable(GL_TEXTURE_GEN_S); gl.glEnable(GL_TEXTURE_GEN_T); gl.glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); gl.glTexGenfv(GL_S, GL_OBJECT_PLANE, TexCoordX5); gl.glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); gl.glTexGenfv(GL_T, GL_OBJECT_PLANE, TexCoordY5); gl.glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); gl.glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE, 2); //tex5 - covertex gl.glActiveTextureARB(GL_TEXTURE5_ARB); gl.glDisable(GL_TEXTURE_2D); gl.glBindTexture(GL_TEXTURE_2D, texture[coverTex]); gl.glEnable(GL_TEXTURE_GEN_S); gl.glEnable(GL_TEXTURE_GEN_T); gl.glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); gl.glTexGenfv(GL_S, GL_OBJECT_PLANE, TexCoordX4); gl.glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); gl.glTexGenfv(GL_T, GL_OBJECT_PLANE, TexCoordY4); } private void setLowDetailLandscape() { float TexCoordX4[] = {1f / (mapSize * mapScaleFactor), 0, 0f, 0.0f}; float TexCoordY4[] = {0, 0f, 1f / (mapSize * mapScaleFactor), 0.0f}; float TexCoordX5[] = {0.03f, 0.0f, 0, 0.0f}; float TexCoordY5[] = {0, 0.0f, 0.03f, 0.0f}; gl.glActiveTextureARB(GL_TEXTURE0_ARB); gl.glEnable(GL_LIGHTING); gl.glDisable(GL_BLEND); gl.glEnable(GL_TEXTURE_2D); gl.glBindTexture(GL_TEXTURE_2D, texture[worldTex]); gl.glEnable(GL_TEXTURE_GEN_S); gl.glEnable(GL_TEXTURE_GEN_T); gl.glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); gl.glTexGenfv(GL_S, GL_OBJECT_PLANE, TexCoordX4); gl.glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); gl.glTexGenfv(GL_T, GL_OBJECT_PLANE, TexCoordY4); gl.glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); //tex4 - noise texture gl.glActiveTextureARB(GL_TEXTURE1_ARB); gl.glEnable(GL_TEXTURE_2D); gl.glBindTexture(GL_TEXTURE_2D, texture[randomnoiseTex]); gl.glEnable(GL_TEXTURE_GEN_S); gl.glEnable(GL_TEXTURE_GEN_T); gl.glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); gl.glTexGenfv(GL_S, GL_OBJECT_PLANE, TexCoordX5); gl.glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); gl.glTexGenfv(GL_T, GL_OBJECT_PLANE, TexCoordY5); gl.glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB); gl.glTexEnvi(GL_TEXTURE_ENV, GL_RGB_SCALE, 2); } private void setUglyMode() { float TexCoordX4[] = {1f / (mapSize * mapScaleFactor), 0, 0f, 0.0f}; float TexCoordY4[] = {0, 0f, 1f / (mapSize * mapScaleFactor), 0.0f}; gl.glActiveTextureARB(GL_TEXTURE0_ARB); gl.glEnable(GL_LIGHTING); gl.glDisable(GL_BLEND); gl.glEnable(GL_TEXTURE_2D); gl.glBindTexture(GL_TEXTURE_2D, texture[worldTex]); gl.glEnable(GL_TEXTURE_GEN_S); gl.glEnable(GL_TEXTURE_GEN_T); gl.glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); gl.glTexGenfv(GL_S, GL_OBJECT_PLANE, TexCoordX4); gl.glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR); gl.glTexGenfv(GL_T, GL_OBJECT_PLANE, TexCoordY4); gl.glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); } private void buildList(SinglePolygon[] polySoup, boolean build) { if (build) { } else {
gl.glPushMatrix(); switch (quality) { //1 texturunit - voodoo 1 etc. case 0 : { setUglyMode(); gl.glEnable(GL_LIGHTING); buff = octree.getVisibles(frustum, playerView); for (int i = 0; i < buff.length; i++) { GLDraw.executeStrips(buff[i].getStrips()); } break; } //2 units - voodoo 2, riva tnt usw case 1 : { setLowDetailLandscape(); gl.glEnable(GL_LIGHTING); buff = octree.getVisibles(frustum, playerView); for (int i = 0; i < buff.length; i++) { GLDraw.executeStrips(buff[i].getStrips()); } break; } //alle details - radeon 8500 ++ case 2 : { gl.glEnable(GL_LIGHTING); setCoverMode(); int nearestNodeIndex=0; int maxDst = viewDistance * viewDistance / 50; buff = octree.getVisibles(frustum, playerView); boolean detailTex = true; for (int i = 0; i < buff.length; i++) { if (detailTex) { GLDraw.executeStrips(buff[i].getStrips()); if (buff[i].getDst() > maxDst) { nearestNodeIndex = i; detailTex = false; gl.glActiveTextureARB(GL_TEXTURE0_ARB); gl.glDisable(GL_TEXTURE_2D); gl.glActiveTextureARB(GL_TEXTURE1_ARB); gl.glDisable(GL_TEXTURE_2D); gl.glActiveTextureARB(GL_TEXTURE2_ARB); gl.glDisable(GL_TEXTURE_2D); gl.glEnable(GL_LIGHTING); } } else { GLDraw.executeStrips(buff[i].getStrips()); } } break; }
} gl.glActiveTextureARB(GL_TEXTURE3_ARB); gl.glDisable(GL_TEXTURE_2D); gl.glActiveTextureARB(GL_TEXTURE4_ARB); gl.glDisable(GL_TEXTURE_2D); gl.glActiveTextureARB(GL_TEXTURE5_ARB); gl.glDisable(GL_TEXTURE_2D); gl.glActiveTextureARB(GL_TEXTURE2_ARB); gl.glDisable(GL_TEXTURE_2D); gl.glActiveTextureARB(GL_TEXTURE1_ARB); gl.glDisable(GL_TEXTURE_2D); gl.glActiveTextureARB(GL_TEXTURE0_ARB); gl.glDisable(GL_TEXTURE_2D); gl.glPopMatrix();
[This message has been edited by HamsterofDeath (edited 02-09-2003).]