GLSL - Using multiple textures
The locations are set 0 and 1 after the call. Is that a good value?
Maybe I'll post more of the code:
Vertex shader:
Fragment shader:
Application:
Thanks so much for your help!
Maybe I'll post more of the code:
Vertex shader:
void main(){ gl_TexCoord[0] = gl_MultiTexCoord0; gl_Position = ftransform();}
Fragment shader:
uniform sampler2D tex1;uniform sampler2D tex2;void main(){ vec4 col1 = texture2D( tex1, gl_TexCoord[0].st ); vec4 col2 = texture2D( tex2, gl_TexCoord[0].st ); //gl_FragColor = col1; gl_FragColor = col2;}
Application:
#include "Headers.h"PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB ;PFNGLDELETEOBJECTARBPROC glDeleteObjectARB ;PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB ;PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB ;PFNGLSHADERSOURCEARBPROC glShaderSourceARB ;PFNGLCOMPILESHADERARBPROC glCompileShaderARB ;PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;PFNGLATTACHOBJECTARBPROC glAttachObjectARB ;PFNGLGETINFOLOGARBPROC glGetInfoLogARB ;PFNGLLINKPROGRAMARBPROC glLinkProgramARB ;PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB ;PFNGLUNIFORM4FARBPROC glUniform4fARB ;PFNGLUNIFORM3FARBPROC glUniform3fARB ; PFNGLUNIFORM1FARBPROC glUniform1fARB ;PFNGLUNIFORM1IARBPROC glUniform1iARB ;PFNGLGETATTRIBLOCATIONARBPROC glGetAttribLocationARB;PFNGLVERTEXATTRIB3FARBPROC glVertexAttrib3fARB;PFNGLVERTEXATTRIBPOINTERARBPROC glVertexAttribPointerARB;PFNGLENABLEVERTEXATTRIBARRAYARBPROC glEnableVertexAttribArrayARB ;PFNGLDISABLEVERTEXATTRIBARRAYARBPROC glDisableVertexAttribArrayARB;CTexture* texColor;CTexture* texLight; GLhandleARB prgmBMap,frgBMap,vrtBMap; //Aspects of the shader, and the shader itselfvoid createExtensions( void ){ ... LEFT OUT}bool CGame::Init( void ){ InitView(); glEnable(GL_TEXTURE_2D); glDisable(GL_CULL_FACE); createExtensions(); char *vs,*fs; //The textfiles prgmBMap = glCreateProgramObjectARB(); //Create the shader // Create the two parts of the shader vrtBMap = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); frgBMap = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); //Read in the shader vs = textFileRead("Shaders/Test1.vert"); //assuming this is the path and name! fs = textFileRead("Shaders/Test1.frag"); //Create temporary variables and compile the shaders const char * vvBMap = vs; const char * ffBMap = fs; glShaderSourceARB(vrtBMap, 1, &vvBMap,NULL); glShaderSourceARB(frgBMap, 1, &ffBMap,NULL); free(vs); free(fs); glCompileShaderARB(vrtBMap); glCompileShaderARB(frgBMap); int cStatus = 0; glGetObjectParameterivARB( vrtBMap, GL_OBJECT_COMPILE_STATUS_ARB, &cStatus ); if( cStatus != 1 ) { int len, tmp; glGetObjectParameterivARB( vrtBMap, GL_OBJECT_INFO_LOG_LENGTH_ARB, &len ); mc.mLog << "Cannot compile vertex shader! Infolog (length " << len << "):<br>"; char* logText = new char[len]; glGetInfoLogARB( vrtBMap, len, &tmp, logText ); mc.mLog << logText; delete[] logText; mc.mLog << "<br>"; }//end if glGetObjectParameterivARB( frgBMap, GL_OBJECT_COMPILE_STATUS_ARB, &cStatus ); if( cStatus != 1 ) { int len, tmp; glGetObjectParameterivARB( frgBMap, GL_OBJECT_INFO_LOG_LENGTH_ARB, &len ); mc.mLog << "Cannot compile fragment shader! Infolog (length " << len << "):<br>"; char* logText = new char[len]; glGetInfoLogARB( frgBMap, len, &tmp, logText ); mc.mLog << logText; delete[] logText; mc.mLog << "<br>"; }//end if //put the parts of the shader into the shader. glAttachObjectARB(prgmBMap,vrtBMap); glAttachObjectARB(prgmBMap,frgBMap); // Free shit glDeleteObjectARB(vrtBMap); glDeleteObjectARB(frgBMap); //Make the shader ready to go! glLinkProgramARB(prgmBMap); glUseProgramObjectARB(prgmBMap); // CREATE TEXTURES ---------------------------------- texColor = mc.mTexMan->add( "data/texColor.bmp", true ); texLight = mc.mTexMan->add( "data/texLight.bmp", true ); // Texture units int tex1 = 0; int tex2 = 1; // Get the locations of the variables int tex1Loc, tex2Loc; tex1Loc = glGetUniformLocationARB( prgmBMap, "tex1" ); tex2Loc = glGetUniformLocationARB( prgmBMap, "tex2" ); // Set the variables glUniform1fARB( tex1Loc, tex1 ); glUniform1fARB( tex2Loc, tex2 ); return true;}//end Initbool CGame::UnInit( void ){ glUseProgramObjectARB(0); return true;}//end Initvoid CGame::Update( float dt ){ // Common preperations glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); mc.mTexMan->glActiveTextureARB(GL_TEXTURE0_ARB); glEnable(GL_TEXTURE_2D); mc.mTexMan->bind(texColor); mc.mTexMan->glActiveTextureARB(GL_TEXTURE1_ARB); glEnable(GL_TEXTURE_2D); mc.mTexMan->bind(texLight); mc.mTexMan->glActiveTextureARB(GL_TEXTURE0_ARB); glBegin(GL_QUADS); mc.mTexMan->glMultiTexCoord2fARB( GL_TEXTURE0_ARB, 0.0f, 0.0f ); mc.mTexMan->glMultiTexCoord2fARB( GL_TEXTURE1_ARB, 0.0f, 0.0f ); glVertex3f( -20.0f, -20.0f, 0.0f ); mc.mTexMan->glMultiTexCoord2fARB( GL_TEXTURE0_ARB, 0.0f, 1.0f ); mc.mTexMan->glMultiTexCoord2fARB( GL_TEXTURE1_ARB, 0.0f, 1.0f ); glVertex3f( -20.0f, 20.0f, 0.0f ); mc.mTexMan->glMultiTexCoord2fARB( GL_TEXTURE0_ARB, 1.0f, 1.0f ); mc.mTexMan->glMultiTexCoord2fARB( GL_TEXTURE1_ARB, 1.0f, 1.0f ); glVertex3f( 20.0f, 20.0f, 0.0f ); mc.mTexMan->glMultiTexCoord2fARB( GL_TEXTURE0_ARB, 1.0f, 0.0f ); mc.mTexMan->glMultiTexCoord2fARB( GL_TEXTURE1_ARB, 1.0f, 0.0f ); glVertex3f( 20.0f, -20.0f, 0.0f ); glEnd();}//end Init
Thanks so much for your help!
That does look correct to me. Have you double checked that both textures are really working? Bind the second texture to unit 0 and it should appear instead of the first texture.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement