18dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang// 28dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang// Copyright (c) 2014 The ANGLE Project Authors. All rights reserved. 38dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang// Use of this source code is governed by a BSD-style license that can be 48dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang// found in the LICENSE file. 58dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang// 68dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang 78dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang#include "texture_utils.h" 8e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang#include <array> 98dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang 108dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff LangGLuint CreateSimpleTexture2D() 118dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang{ 128dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang // Use tightly packed data 138dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 148dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang 158dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang // Generate a texture object 168dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang GLuint texture; 178dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang glGenTextures(1, &texture); 188dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang 198dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang // Bind the texture object 208dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang glBindTexture(GL_TEXTURE_2D, texture); 218dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang 228dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang // Load the texture: 2x2 Image, 3 bytes per pixel (R, G, B) 238dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang const size_t width = 2; 248dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang const size_t height = 2; 258dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang GLubyte pixels[width * height * 3] = 268dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang { 278dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang 255, 0, 0, // Red 288dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang 0, 255, 0, // Green 298dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang 0, 0, 255, // Blue 308dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang 255, 255, 0, // Yellow 318dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang }; 328dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels); 338dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang 348dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang // Set the filtering mode 358dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 368dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 378dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang 388dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang return texture; 398dd592bf2a5ace66d12dc6a4e381fd345fd42da1Geoff Lang} 40705073f7565ae8509c367808a68aa9c569e13247Geoff Lang 41705073f7565ae8509c367808a68aa9c569e13247Geoff LangGLuint CreateSimpleTextureCubemap() 42705073f7565ae8509c367808a68aa9c569e13247Geoff Lang{ 43705073f7565ae8509c367808a68aa9c569e13247Geoff Lang // Generate a texture object 44705073f7565ae8509c367808a68aa9c569e13247Geoff Lang GLuint texture; 45705073f7565ae8509c367808a68aa9c569e13247Geoff Lang glGenTextures(1, &texture); 46705073f7565ae8509c367808a68aa9c569e13247Geoff Lang 47705073f7565ae8509c367808a68aa9c569e13247Geoff Lang // Bind the texture object 48705073f7565ae8509c367808a68aa9c569e13247Geoff Lang glBindTexture(GL_TEXTURE_CUBE_MAP, texture); 49705073f7565ae8509c367808a68aa9c569e13247Geoff Lang 50705073f7565ae8509c367808a68aa9c569e13247Geoff Lang // Load the texture faces 51705073f7565ae8509c367808a68aa9c569e13247Geoff Lang GLubyte pixels[6][3] = 52705073f7565ae8509c367808a68aa9c569e13247Geoff Lang { 53705073f7565ae8509c367808a68aa9c569e13247Geoff Lang // Face 0 - Red 54705073f7565ae8509c367808a68aa9c569e13247Geoff Lang 255, 0, 0, 55705073f7565ae8509c367808a68aa9c569e13247Geoff Lang // Face 1 - Green, 56705073f7565ae8509c367808a68aa9c569e13247Geoff Lang 0, 255, 0, 57705073f7565ae8509c367808a68aa9c569e13247Geoff Lang // Face 3 - Blue 58705073f7565ae8509c367808a68aa9c569e13247Geoff Lang 0, 0, 255, 59705073f7565ae8509c367808a68aa9c569e13247Geoff Lang // Face 4 - Yellow 60705073f7565ae8509c367808a68aa9c569e13247Geoff Lang 255, 255, 0, 61705073f7565ae8509c367808a68aa9c569e13247Geoff Lang // Face 5 - Purple 62705073f7565ae8509c367808a68aa9c569e13247Geoff Lang 255, 0, 255, 63705073f7565ae8509c367808a68aa9c569e13247Geoff Lang // Face 6 - White 64705073f7565ae8509c367808a68aa9c569e13247Geoff Lang 255, 255, 255 65705073f7565ae8509c367808a68aa9c569e13247Geoff Lang }; 66705073f7565ae8509c367808a68aa9c569e13247Geoff Lang 67705073f7565ae8509c367808a68aa9c569e13247Geoff Lang for (size_t i = 0; i < 6; i++) 68705073f7565ae8509c367808a68aa9c569e13247Geoff Lang { 69705073f7565ae8509c367808a68aa9c569e13247Geoff Lang glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, &pixels[i]); 70705073f7565ae8509c367808a68aa9c569e13247Geoff Lang } 71705073f7565ae8509c367808a68aa9c569e13247Geoff Lang 72705073f7565ae8509c367808a68aa9c569e13247Geoff Lang // Set the filtering mode 73705073f7565ae8509c367808a68aa9c569e13247Geoff Lang glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 74705073f7565ae8509c367808a68aa9c569e13247Geoff Lang glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 75705073f7565ae8509c367808a68aa9c569e13247Geoff Lang 76705073f7565ae8509c367808a68aa9c569e13247Geoff Lang return texture; 77705073f7565ae8509c367808a68aa9c569e13247Geoff Lang} 78e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang 79e9b02245e076600fb27469aef9c68f04110d8433Geoff LangGLuint CreateMipMappedTexture2D() 80e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang{ 81e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang // Texture object handle 82e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang const size_t width = 256; 83e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang const size_t height = 256; 84e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang std::array<GLubyte, width * height * 3> pixels; 85e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang 86e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang const size_t checkerSize = 8; 87e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang for (GLsizei y = 0; y < height; y++) 88e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang { 89e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang for (GLsizei x = 0; x < width; x++) 90e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang { 91e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang GLubyte rColor = 0; 92e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang GLubyte bColor = 0; 93e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang 94e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang if ((x / checkerSize) % 2 == 0) 95e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang { 96e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang rColor = 255 * ((y / checkerSize) % 2); 97e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang bColor = 255 * (1 - ((y / checkerSize) % 2)); 98e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang } 99e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang else 100e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang { 101e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang bColor = 255 * ((y / checkerSize) % 2); 102e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang rColor = 255 * (1 - ((y / checkerSize) % 2)); 103e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang } 104e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang 105e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang pixels[(y * height + x) * 3] = rColor; 106e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang pixels[(y * height + x) * 3 + 1] = 0; 107e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang pixels[(y * height + x) * 3 + 2] = bColor; 108e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang } 109e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang } 110e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang 111e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang // Generate a texture object 112e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang GLuint texture; 113e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang glGenTextures(1, &texture); 114e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang 115e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang // Bind the texture object 116e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang glBindTexture(GL_TEXTURE_2D, texture); 117e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang 118e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang // Load mipmap level 0 119e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels.data()); 120e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang 121e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang // Generate mipmaps 122e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang glGenerateMipmap(GL_TEXTURE_2D); 123e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang 124e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang // Set the filtering mode 125e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST); 126e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 127e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang 128e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang return texture; 129e9b02245e076600fb27469aef9c68f04110d8433Geoff Lang} 130