Advertisement Jump to content
Sign in to follow this  
Peyman Tahghighi

OpenGL Load multi texture opengl es 2.0

This topic is 1764 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

i'm found this piece of code on internet about how to load multi texture in opengl es 2.0:

//
// Book:      OpenGL(R) ES 2.0 Programming Guide
// Authors:   Aaftab Munshi, Dan Ginsburg, Dave Shreiner
// ISBN-10:   0321502795
// ISBN-13:   9780321502797
// Publisher: Addison-Wesley Professional
// URLs:      http://safari.informit.com/9780321563835
//            http://www.opengles-book.com
//

// MultiTexture.c
//
//    This is an example that draws a quad with a basemap and
//    lightmap to demonstrate multitexturing.
//
#include"pch.h"
#include <stdlib.h>

typedef struct
{
	// Handle to a program object
	GLuint programObject;

	// Attribute locations
	GLint  positionLoc;
	GLint  texCoordLoc;

	// Sampler locations
	GLint baseMapLoc;
	GLint lightMapLoc;

	// Texture handle
	GLuint baseMapTexId;
	GLuint lightMapTexId;

} UserData;


///
// Load texture from disk
//
GLuint LoadTexture(char *fileName)
{
	int width,
		height;
	char *buffer = esLoadTGA(fileName, &width, &height);
	GLuint texId;

	if (buffer == NULL)
	{
		esLogMessage("Error loading (%s) image.\n", fileName);
		return 0;
	}

	glGenTextures(1, &texId);
	glBindTexture(GL_TEXTURE_2D, texId);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, buffer);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

	free(buffer);

	return texId;
}



///
// Initialize the shader and program object
//
int Init(ESContext *esContext)
{
	UserData *userData = (UserData*) esContext->userData;
	const char vShaderStr[] =
		"attribute vec4 a_position;   \n"
		"attribute vec2 a_texCoord;   \n"
		"varying vec2 v_texCoord;     \n"
		"void main()                  \n"
		"{                            \n"
		"   gl_Position = a_position; \n"
		"   v_texCoord = a_texCoord;  \n"
		"}                            \n";

	const char fShaderStr[] =
		"precision mediump float;                            \n"
		"varying vec2 v_texCoord;                            \n"
		"uniform sampler2D s_baseMap;                        \n"
		"uniform sampler2D s_lightMap;                       \n"
		"void main()                                         \n"
		"{                                                   \n"
		"  vec4 baseColor;                                   \n"
		"  vec4 lightColor;                                  \n"
		"                                                    \n"
		"  gl_FragColor = vec4(1.0,0.0,0.0,1.0) ;            \n"
		"}                                                   \n";

	// Load the shaders and get a linked program object
	userData->programObject = esLoadProgram(vShaderStr, fShaderStr);
	

	// Get the attribute locations
	userData->positionLoc = glGetAttribLocation(userData->programObject, "a_position");
	userData->texCoordLoc = glGetAttribLocation(userData->programObject, "a_texCoord");

	// Get the sampler location
	userData->baseMapLoc = glGetUniformLocation(userData->programObject, "s_baseMap");
	userData->lightMapLoc = glGetUniformLocation(userData->programObject, "s_lightMap");

	// Load the textures
	userData->baseMapTexId = LoadTexture("basemap.tga");
	userData->lightMapTexId = LoadTexture("lightmap.tga");

	if (userData->baseMapTexId == 0 || userData->lightMapTexId == 0)
		return FALSE;

	glViewport(0, 0, esContext->width, esContext->height);
	userData->programObject = glCreateProgram();
	return TRUE;
}

///
// Draw a triangle using the shader pair created in Init()
//
void Draw(ESContext *esContext)
{
	UserData *userData = (UserData*)esContext->userData;
	GLfloat vVertices[] = { -0.5f, 0.5f, 0.0f,  // Position 0
		0.0f, 0.0f,        // TexCoord 0 
		-0.5f, -0.5f, 0.0f,  // Position 1
		0.0f, 1.0f,        // TexCoord 1
		0.5f, -0.5f, 0.0f,  // Position 2
		1.0f, 1.0f,        // TexCoord 2
		0.5f, 0.5f, 0.0f,  // Position 3
		1.0f, 0.0f         // TexCoord 3
	};
	GLushort indices[] = { 0, 1, 2, 2, 1, 3 };

	// Set the viewport
	

	// Clear the color buffer
	glClearColor(1.0, 1.0, 1.0, 0.0);
	glClear(GL_COLOR_BUFFER_BIT);
	
	// Use the program object
	glUseProgram(userData->programObject);

	// Load the vertex position
	glVertexAttribPointer(userData->positionLoc, 3, GL_FLOAT,
		GL_FALSE, 5 * sizeof(GLfloat), vVertices);
	// Load the texture coordinate
	glVertexAttribPointer(userData->texCoordLoc, 2, GL_FLOAT,
		GL_FALSE, 5 * sizeof(GLfloat), &vVertices[3]);

	glEnableVertexAttribArray(userData->positionLoc);
	glEnableVertexAttribArray(userData->texCoordLoc);

	// Bind the base map
	glActiveTexture(GL_TEXTURE0);
	glBindTexture(GL_TEXTURE_2D, userData->baseMapTexId);

	// Set the base map sampler to texture unit to 0
	glUniform1i(userData->baseMapLoc, 0);

	// Bind the light map
	glActiveTexture(GL_TEXTURE1);
	glBindTexture(GL_TEXTURE_2D, userData->lightMapTexId);

	// Set the light map sampler to texture unit 1
	glUniform1i(userData->lightMapLoc, 1);

	glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);

	eglSwapBuffers(esContext->eglDisplay, esContext->eglSurface);
}

///
// Cleanup
//
void ShutDown(ESContext *esContext)
{
	UserData *userData = (UserData*)esContext->userData;

	// Delete texture object
	glDeleteTextures(1, &userData->baseMapTexId);
	glDeleteTextures(1, &userData->lightMapTexId);

	// Delete program object
	glDeleteProgram(userData->programObject);
}


int main(int argc, char *argv[])
{
	ESContext esContext;
	UserData  userData;
	esInitContext(&esContext);
	esContext.userData = &userData;

	esCreateWindow(&esContext, L"MultiTexture", 320, 240, ES_WINDOW_RGB);

	if (!Init(&esContext))
		return 0;

	esRegisterDrawFunc(&esContext, Draw);

	esMainLoop(&esContext);

	ShutDown(&esContext);
}

but when i run this it shows only dark! debugging the code shows that nothing is null or anything,so what's wrong with it? i add two files named same as in the code but still i see a dark space! any suggestion? and another question is this is the common way to load any number of texture i want or not?

 

Share this post


Link to post
Share on other sites
Advertisement

Just some question before a comment.

1. Did you just copy and paste the code without understanding the underlying concept ? Which leads me to the my comment.

Given the capacity/understanding on how to load a single texture, loading multiple textures is just an extension to that.

There is a lot of things going on in the code you posted, texture loading is just a part of the equation. Is the shader set up correct ? Are you getting GL errors ? Are you able to load a single texture?

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!