glClientActiveTextureARB(GL_TEXTURE0_ARB);
glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_TexCoVBO);
glTexCoordPointer( 2, GL_FLOAT, 0, (char *)NULL);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glClientActiveTextureARB(GL_TEXTURE1_ARB);
glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_TexCoVBO);
glTexCoordPointer( 2, GL_FLOAT, 0, (char *)NULL);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture[1]);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_INTERPOLATE_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_PRIMARY_COLOR_ARB);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_ALPHA);
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
weird problem with vertexalpha, blending [solved]
Hi guys!
I've a very weird problem.. I'm searching the problem for hours now, so I thought I could ask you experts:
What I have:
My little terrain-engine is blending 2 texures based on their vertex alpha values:
All the vertex data is held in a vbo, same for the texture coordinates. The data is drawn with index-buffers (one for each lod).
Ok, that works fine, all vertizes are blended EXCEPT the last one.
Example:
As you can see on the image, the two textures on the left are blended, except the last vertex (the upper right corner). For debuging, I even mapped the buffers to check all values.. I'm really help- and hopeless :/ Does anybody have an idea what the problem could be? If you need additional code, just ask me..
Thanks a lot!
misto
[Edited by - misto on August 16, 2004 8:22:43 AM]
Hi!
Yes sure, here the code to initialize the vbos:
the code for the texture-coordinates buffer is very similar, I think it should be correct, because the texture is applied correct.
the index buffer:
Hmm.. the code might look a bit confusing, but it seems to work so far, at least for the geometry :)
and now the rendering:
Hmm.. yes, that should be all :) If somebody needs the whole code, I could send it per email.. (runs under linux only)
Thanks a lot!
Yes sure, here the code to initialize the vbos:
glGenBuffersARB( 1, &m_VBOVertex );m_Data = new Vertex[1089];for( int iY = 0; iY <= 32; iY++)for( int iX = 0; iX <= 32; iX++){m_Data[iV].fX = iX;m_Data[iV].fY = iY;m_Data[iV].fZ = 0;m_Data[iV].fA = 0.5;iV++; }glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_VBOVertex );glBufferDataARB( GL_ARRAY_BUFFER_ARB, iV * sizeof(Vertex), m_Data, GL_STATIC_DRAW_ARB);
the code for the texture-coordinates buffer is very similar, I think it should be correct, because the texture is applied correct.
the index buffer:
patches = 32;int step = 8; int anzIndices = patches/step * (patches*2/step + 2);GLushort* data = new GLushort[anzIndices];int iI = 0; for( int iY = 0; iY < patches; iY+=step){ for( int iX = 0; iX <= patches; iX+=step) { if(iY%(2*step) == 0) { data[iI] = (patches+1) * (iY+step) + iX; iI++; data[iI] = (patches+1) * (iY+0) + iX; iI++; } else { data[iI] = (patches+1) * (iY+0) + patches - iX; iI++; data[iI] = (patches+1) * (iY+step) + patches - iX; iI++; } }}m_IndexBufferCount = anzIndices; glGenBuffersARB(1, &m_IndexBuffer);glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, m_IndexBuffer);glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, anzIndices*sizeof(GLushort), data, GL_STATIC_DRAW_ARB);
Hmm.. the code might look a bit confusing, but it seems to work so far, at least for the geometry :)
and now the rendering:
glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_Patches[iX][iY]->getVBO() );glVertexPointer( 3, GL_FLOAT, sizeof(Vertex), (char *)NULL);glColorPointer ( 4, GL_FLOAT, sizeof(Vertex), (char *)NULL + 96);glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, m_IndexBuffer[m_Patches[iX][iY]->getLOD()]);glClientActiveTextureARB(GL_TEXTURE0_ARB); glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_TexCoVBO);glTexCoordPointer( 2, GL_FLOAT, 0, (char *)NULL); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glClientActiveTextureARB(GL_TEXTURE1_ARB); glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_TexCoVBO);glTexCoordPointer( 2, GL_FLOAT, 0, (char *)NULL); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glActiveTextureARB(GL_TEXTURE1_ARB);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, texture[1]); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_INTERPOLATE_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_ARB);glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE);glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_PRIMARY_COLOR_ARB);glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_ALPHA); glActiveTextureARB(GL_TEXTURE0_ARB);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, texture[0]); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glDrawElements(GL_TRIANGLE_STRIP, m_IndexBufferCount[m_Patches[iX][iY]->getLOD()], GL_UNSIGNED_SHORT, (GLushort*)NULL);
Hmm.. yes, that should be all :) If somebody needs the whole code, I could send it per email.. (runs under linux only)
Thanks a lot!
glColorPointer ( 4, GL_FLOAT, sizeof(Vertex), (char *)NULL + 96);
Why the +96? I thought the pointer should simply be set to NULL?
That is because of my vertex-structure:
94 is the offset in bits from the beginning of the class 8bit/byte * 3 vertizes * 4byte/float, isn't it like that?
class Vertex{public: float fX, fY, fZ, fR, fG, fB, fA;};
94 is the offset in bits from the beginning of the class 8bit/byte * 3 vertizes * 4byte/float, isn't it like that?
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement