Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Opengl纹理初始化过程_C++_Opengl_Textures - Fatal编程技术网

C++ Opengl纹理初始化过程

C++ Opengl纹理初始化过程,c++,opengl,textures,C++,Opengl,Textures,我有一个简单的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);

我有一个简单的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\u load\u image
函数读取我的图像“texturemap.jpg”,并将其存储在
textureMapData
变量中。现在,我想知道,下面四行的目的是什么。我的意思是,我已经看过数据了。我是否用以下4行将这些数据放入gTextureSphere变量中?我想这是不可能的,因为gTextureSphere是GLuint类型的变量。谁能给我解释一下吗

现在,我想知道,下面四行的目的是什么

到目前为止,纹理数据只加载到程序的地址空间中。但是OpenGL,渲染器API并没有“神奇地”了解数据的可用性。让我们把它分解一下:

首先生成我们与OpenGL对话的OpenGL句柄,以便它知道我们与它对话的是什么纹理对象。生成的句柄将存储在变量
gTextureSphere

glGenTextures(1,&gTextureSphere);
glBindTexture(GL_TEXTURE_2D,gTextureSphere);
OpenGL有几个“插头”,称为纹理单元,纹理对象可以“连接到”这些“插头”。这告诉OpenGL,纹理单元0(
GL\u TEXTURE0
)上应该发生以下操作:

接下来,在刚刚选择的纹理单元和我们使用的纹理对象之间建立连接,OpenGL同意通过变量
gTextureSphere
中包含的值进行调用

glGenTextures(1,&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现在有自己的副本

gTextureSphere是纹理的控制柄。这四行创建了一个新的纹理,并将数据从RAM上传到GPU内存。@BDL谢谢你的回复,你说的句柄是什么意思?还有一个问题,在这些行之后,如果我想访问我的纹理,我应该调用gTextureSphere变量吗?每个opengl对象都是通过句柄指定的。这只是标识对象的整数。您可以使用适当的OpenGL函数访问纹理,并且应该明确阅读OpenGL的入门教程。OpenGL仍然在某种程度上基于“客户机/服务器”体系结构,其中您的程序代表客户机,您需要在某种意义上“将数据上传到服务器”。这通常(但并非总是)需要将图像数据从程序内存复制到GPU自己的内存中。@PeterT:实际上OpenGL的内存模型不知道“GPU”是什么。数据可以根据需要在CPU和GPU内存之间自由交换。OpenGL使用抽象内存模型的真正原因是,在现代操作系统中,图形不应该是独占资源,因此没有人为施加的内存限制。事实上,OpenGL的可用系统内存很大程度上限制了您的使用。很好的解释,我真的很感激,因为您不仅投了反对票,而且给出了令人满意的结果explanation@kemalgunes:事实上我甚至给了你一票。我认为你的问题并不坏。(没有愚蠢的问题,但许多问题研究不足,但你的答案是完全正确的)。顺便提一下,我还有一个问题,你知道我们可以用gl_位置变量访问glsl部分顶点的笛卡尔坐标,有没有类似的变量可以用来访问glsl中单个顶点的u-v坐标?当我看网页时,我发现有一个gl_多纹理库,但我不使用多纹理。即使我不使用,我可以调用gl_multiTexCoor[0]来获取我的u-v坐标吗?实际上我已经发现有一个gl_TexCoord变量,但我找不到它的类型,我猜它不是vec2类型。(我认为这是因为当我定义一个vec2 temp变量并执行temp=gl_TexCoord;)编译器说不可计算类型的赋值