1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2014 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker
7*8975f5c5SAndroid Build Coastguard Worker #include "texture_utils.h"
8*8975f5c5SAndroid Build Coastguard Worker #include <array>
9*8975f5c5SAndroid Build Coastguard Worker #include <cstddef>
10*8975f5c5SAndroid Build Coastguard Worker
CreateSimpleTexture2D()11*8975f5c5SAndroid Build Coastguard Worker GLuint CreateSimpleTexture2D()
12*8975f5c5SAndroid Build Coastguard Worker {
13*8975f5c5SAndroid Build Coastguard Worker // Use tightly packed data
14*8975f5c5SAndroid Build Coastguard Worker glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
15*8975f5c5SAndroid Build Coastguard Worker
16*8975f5c5SAndroid Build Coastguard Worker // Generate a texture object
17*8975f5c5SAndroid Build Coastguard Worker GLuint texture;
18*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &texture);
19*8975f5c5SAndroid Build Coastguard Worker
20*8975f5c5SAndroid Build Coastguard Worker // Bind the texture object
21*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
22*8975f5c5SAndroid Build Coastguard Worker
23*8975f5c5SAndroid Build Coastguard Worker // Load the texture: 2x2 Image, 3 bytes per pixel (R, G, B)
24*8975f5c5SAndroid Build Coastguard Worker const size_t width = 2;
25*8975f5c5SAndroid Build Coastguard Worker const size_t height = 2;
26*8975f5c5SAndroid Build Coastguard Worker GLubyte pixels[width * height * 3] = {
27*8975f5c5SAndroid Build Coastguard Worker 255, 0, 0, // Red
28*8975f5c5SAndroid Build Coastguard Worker 0, 255, 0, // Green
29*8975f5c5SAndroid Build Coastguard Worker 0, 0, 255, // Blue
30*8975f5c5SAndroid Build Coastguard Worker 255, 255, 0, // Yellow
31*8975f5c5SAndroid Build Coastguard Worker };
32*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, pixels);
33*8975f5c5SAndroid Build Coastguard Worker
34*8975f5c5SAndroid Build Coastguard Worker // Set the filtering mode
35*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
36*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
37*8975f5c5SAndroid Build Coastguard Worker
38*8975f5c5SAndroid Build Coastguard Worker return texture;
39*8975f5c5SAndroid Build Coastguard Worker }
40*8975f5c5SAndroid Build Coastguard Worker
CreateSimpleTextureCubemap()41*8975f5c5SAndroid Build Coastguard Worker GLuint CreateSimpleTextureCubemap()
42*8975f5c5SAndroid Build Coastguard Worker {
43*8975f5c5SAndroid Build Coastguard Worker // Generate a texture object
44*8975f5c5SAndroid Build Coastguard Worker GLuint texture;
45*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &texture);
46*8975f5c5SAndroid Build Coastguard Worker
47*8975f5c5SAndroid Build Coastguard Worker // Bind the texture object
48*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
49*8975f5c5SAndroid Build Coastguard Worker
50*8975f5c5SAndroid Build Coastguard Worker // Load the texture faces
51*8975f5c5SAndroid Build Coastguard Worker GLubyte pixels[6][3] = {// Face 0 - Red
52*8975f5c5SAndroid Build Coastguard Worker {255, 0, 0},
53*8975f5c5SAndroid Build Coastguard Worker // Face 1 - Green,
54*8975f5c5SAndroid Build Coastguard Worker {0, 255, 0},
55*8975f5c5SAndroid Build Coastguard Worker // Face 3 - Blue
56*8975f5c5SAndroid Build Coastguard Worker {0, 0, 255},
57*8975f5c5SAndroid Build Coastguard Worker // Face 4 - Yellow
58*8975f5c5SAndroid Build Coastguard Worker {255, 255, 0},
59*8975f5c5SAndroid Build Coastguard Worker // Face 5 - Purple
60*8975f5c5SAndroid Build Coastguard Worker {255, 0, 255},
61*8975f5c5SAndroid Build Coastguard Worker // Face 6 - White
62*8975f5c5SAndroid Build Coastguard Worker {255, 255, 255}};
63*8975f5c5SAndroid Build Coastguard Worker
64*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < 6; i++)
65*8975f5c5SAndroid Build Coastguard Worker {
66*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(static_cast<GLenum>(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i), 0, GL_RGB, 1, 1, 0,
67*8975f5c5SAndroid Build Coastguard Worker GL_RGB, GL_UNSIGNED_BYTE, &pixels[i]);
68*8975f5c5SAndroid Build Coastguard Worker }
69*8975f5c5SAndroid Build Coastguard Worker
70*8975f5c5SAndroid Build Coastguard Worker // Set the filtering mode
71*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
72*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
73*8975f5c5SAndroid Build Coastguard Worker
74*8975f5c5SAndroid Build Coastguard Worker return texture;
75*8975f5c5SAndroid Build Coastguard Worker }
76*8975f5c5SAndroid Build Coastguard Worker
CreateMipMappedTexture2D()77*8975f5c5SAndroid Build Coastguard Worker GLuint CreateMipMappedTexture2D()
78*8975f5c5SAndroid Build Coastguard Worker {
79*8975f5c5SAndroid Build Coastguard Worker // Texture object handle
80*8975f5c5SAndroid Build Coastguard Worker const size_t width = 256;
81*8975f5c5SAndroid Build Coastguard Worker const size_t height = 256;
82*8975f5c5SAndroid Build Coastguard Worker std::array<GLubyte, width * height * 3> pixels;
83*8975f5c5SAndroid Build Coastguard Worker
84*8975f5c5SAndroid Build Coastguard Worker const size_t checkerSize = 8;
85*8975f5c5SAndroid Build Coastguard Worker for (size_t y = 0; y < height; y++)
86*8975f5c5SAndroid Build Coastguard Worker {
87*8975f5c5SAndroid Build Coastguard Worker for (size_t x = 0; x < width; x++)
88*8975f5c5SAndroid Build Coastguard Worker {
89*8975f5c5SAndroid Build Coastguard Worker GLubyte rColor = 0;
90*8975f5c5SAndroid Build Coastguard Worker GLubyte bColor = 0;
91*8975f5c5SAndroid Build Coastguard Worker
92*8975f5c5SAndroid Build Coastguard Worker if ((x / checkerSize) % 2 == 0)
93*8975f5c5SAndroid Build Coastguard Worker {
94*8975f5c5SAndroid Build Coastguard Worker rColor = 255 * ((y / checkerSize) % 2);
95*8975f5c5SAndroid Build Coastguard Worker bColor = 255 * (1 - ((y / checkerSize) % 2));
96*8975f5c5SAndroid Build Coastguard Worker }
97*8975f5c5SAndroid Build Coastguard Worker else
98*8975f5c5SAndroid Build Coastguard Worker {
99*8975f5c5SAndroid Build Coastguard Worker bColor = 255 * ((y / checkerSize) % 2);
100*8975f5c5SAndroid Build Coastguard Worker rColor = 255 * (1 - ((y / checkerSize) % 2));
101*8975f5c5SAndroid Build Coastguard Worker }
102*8975f5c5SAndroid Build Coastguard Worker
103*8975f5c5SAndroid Build Coastguard Worker pixels[(y * height + x) * 3] = rColor;
104*8975f5c5SAndroid Build Coastguard Worker pixels[(y * height + x) * 3 + 1] = 0;
105*8975f5c5SAndroid Build Coastguard Worker pixels[(y * height + x) * 3 + 2] = bColor;
106*8975f5c5SAndroid Build Coastguard Worker }
107*8975f5c5SAndroid Build Coastguard Worker }
108*8975f5c5SAndroid Build Coastguard Worker
109*8975f5c5SAndroid Build Coastguard Worker // Generate a texture object
110*8975f5c5SAndroid Build Coastguard Worker GLuint texture;
111*8975f5c5SAndroid Build Coastguard Worker glGenTextures(1, &texture);
112*8975f5c5SAndroid Build Coastguard Worker
113*8975f5c5SAndroid Build Coastguard Worker // Bind the texture object
114*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
115*8975f5c5SAndroid Build Coastguard Worker
116*8975f5c5SAndroid Build Coastguard Worker // Load mipmap level 0
117*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE,
118*8975f5c5SAndroid Build Coastguard Worker pixels.data());
119*8975f5c5SAndroid Build Coastguard Worker
120*8975f5c5SAndroid Build Coastguard Worker // Generate mipmaps
121*8975f5c5SAndroid Build Coastguard Worker glGenerateMipmap(GL_TEXTURE_2D);
122*8975f5c5SAndroid Build Coastguard Worker
123*8975f5c5SAndroid Build Coastguard Worker // Set the filtering mode
124*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
125*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
126*8975f5c5SAndroid Build Coastguard Worker
127*8975f5c5SAndroid Build Coastguard Worker return texture;
128*8975f5c5SAndroid Build Coastguard Worker }
129