Opengl 纹理初始化过程
Opengl texture initialization process
我有一个简单的openGL问题,目前我正在尝试学习纹理,这是我对此感到困惑的部分:
void initTextures()
{
GLuint gTextureSphere;
int width, height, channels = 1;
unsigned char* textureMapData = SOIL_load_image("res/texturemap.jpg", &width, &height, 0, SOIL_LOAD_RGB);
//texture map
glGenTextures(1,&gTextureSphere);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,gTextureSphere);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, textureMapData);
SOIL_free_image_data(textureMapData);
glUniform1i(glGetUniformLocation(gProgramSphere, "normalTexture"), 0);
////////////////////////
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
}
我认为上面的代码通过SOIL_load_image
函数读取我的图像"texturemap.jpg"并将其存储在textureMapData
变量中。现在,我想知道,遵循 4 行的目的是什么。我的意思是,我已经阅读了数据。我是否使用以下 4 行将数据放入 gTextureSphere 变量中?我想这是不可能的,因为gTextureSphere是一个GLuint类型的变量。谁能解释我?
现在,我想知道,遵循 4 行的目的是什么。
到目前为止,纹理数据仅加载到程序的地址空间中。但是OpenGL,渲染器API并没有"神奇地"了解该数据的可用性。让我们分解一下:
首先生成一个我们与OpenGL通信的OpenGL句柄,以便它知道我们正在与之交谈的纹理对象。生成的句柄将存储在变量gTextureSphere
中。
glGenTextures(1,&gTextureSphere);
OpenGL有几个"插件",称为纹理单元,纹理对象可以"连接到"其中。这告诉 OpenGL,应在纹理单元 0 (GL_TEXTURE0
( 上进行以下操作:
glActiveTexture(GL_TEXTURE0);
接下来在刚刚选择的纹理单元和纹理对象之间建立连接我们,和OpenGL达成了协议,通过变量gTextureSphere
中包含的值来调用。
glBindTexture(GL_TEXTURE_2D,gTextureSphere);
现在OpenGL知道了,我们正在谈论纹理单元0和要插入其中的某个纹理,我们可以告诉它对纹理对象执行某些操作。例如,复制图像数据,从文件中读取并解码到某个缓冲区中。
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, textureMapData);
此时,OpenGL有一个纹理对象,其中包含图像数据的工作副本;我们现在可以安全地释放用于解码图像文件的缓冲区,因为OpenGL现在有自己的副本。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 是重构过程中结构安全的骨料初始化
- C 在结构初始化过程中带有内部阵列的奇怪错误
- 在构造过程中获取类成员的未初始化引用是否合法
- Opengl 纹理初始化过程
- 在复制初始化过程中不会发生std::string的隐式构造
- 如何在初始化过程中将C中的char转换为int
- 检测CRT初始化是否在注入过程中完成
- 类初始化过程中的内存重叠
- 了解初始化过程
- 在初始化过程中是否存在动态绑定
- 静态指针不会在子类化窗口过程中初始化?
- 在引导过程中,在驱动程序初始化后执行操作