xref: /aosp_15_r20/external/angle/samples/sample_util/texture_utils.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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