Jump to content

  • Log In with Google      Sign In   
  • Create Account

Banner advertising on our site currently available from just $5!


1. Learn about the promo. 2. Sign up for GDNet+. 3. Set up your advert!


Load multi texture opengl es 2.0


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   -  Reputation: 108

Like
0Likes
Like

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"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?

 



Sponsor:

#2 cgrant   Members   -  Reputation: 956

Like
-1Likes
Like

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.



PARTNERS