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