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