Chapter 19: Textures

Slide Deck From Class

This is also a very good overview

How To Use Textures

Create a handle for the texture.

GLuint TextureID;

Create and bind the texture.

glGenTextures(1, &TextureID);
glBindTexture(GL_TEXTURE_2D, TextureID);

Set any parameters

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

Upload image data.

std::string const path = resourceDirectory + "/Image.jpg";
int width, height, channels;
unsigned char * data = stbi_load(path.c_str(), & width, & height, & channels, 0);
if (data)
{
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
	glGenerateMipmap(GL_TEXTURE_2D);
	stbi_image_free(data);
}

Now, in the render loop. Active a texture slot and bind your texture to it.

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, TextureID);

Specify a uniform that contains the texture slot you just bound the texture to (NOT the texture handle itself).

glUniform1i(prog->getUniform("uTexture"), 0);

In the fragment shader (or vertex shader, if you want to), you can access the texture using the uniform we just bound. It has type sampler2D, even though we used the integer uniform method in our C++ code.

uniform sampler2D uTexture;

void main()
{
	vec4 color = texture(uTexture, fTexCoords);

	// ...
}