Jump to content

View more

Image of the Day

#ld38 #screenshotsaturday Mimosa Fizz action gif #2 https://t.co/TUzdppvfUL
IOTD | Top Screenshots

The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

Sign up now

Load multi texture opengl es 2.0

4: Adsense

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
1 reply to this topic

#1 PeymanKOP   Members   


Posted 25 March 2014 - 05:33 AM

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 <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,
	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);


	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);
	// Use the program object

	// 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]);


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

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

	// Bind the light map
	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

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

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

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

	esRegisterDrawFunc(&esContext, Draw);



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?


#2 cgrant   Members   


Posted 25 March 2014 - 01:14 PM

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?

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.