GLSL - Using multiple textures

Started by
13 comments, last by VanKurt 18 years, 3 months ago
and do you get sane locations back for your two sampler uniforms?
Advertisement
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:

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!
[help] Uah! Please help me!
I'm sooo desperate!!
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.
Yep, I did that. Both are working...
This stuff is freakin me out!

This topic is closed to new replies.

Advertisement