C++ 不带着色器的纹理缓冲区对象

C++ 不带着色器的纹理缓冲区对象,c++,opengl,textures,C++,Opengl,Textures,所有在线教程都是用opengl 3+编写的,并智能使用着色器 我想知道,我可以创建一个纹理缓冲区对象并显示纹理而不使用着色器吗?在非常古老的opengl uber弃用api调用中,您可以编写gltexcoord,我只是尝试了这种方法,只是想看看我的加载程序是否正常,它是否正常 使用TBO我遇到了一些问题 假设我正在创建一个四边形,然后在加载图像(名为txtr)后,我将坐标存储在一个向量中 terrainTBO.push_back(1); terrainTBO.push_back(1); ter

所有在线教程都是用opengl 3+编写的,并智能使用着色器

我想知道,我可以创建一个纹理缓冲区对象并显示纹理而不使用着色器吗?在非常古老的opengl uber弃用api调用中,您可以编写gltexcoord,我只是尝试了这种方法,只是想看看我的加载程序是否正常,它是否正常

使用TBO我遇到了一些问题

假设我正在创建一个四边形,然后在加载图像(名为txtr)后,我将坐标存储在一个向量中

terrainTBO.push_back(1);
terrainTBO.push_back(1);

terrainTBO.push_back(0);
terrainTBO.push_back(1);

terrainTBO.push_back(1);
terrainTBO.push_back(0);

terrainTBO.push_back(0);
terrainTBO.push_back(0);
然后,在初始化地形的过程中 (显然,我在这里不是在写顶点和索引)

在图纸部分:

glEnable(GL_TEXTURE_2D);
glhBindTexture(txtr);

glBindBuffer(GL_ARRAY_BUFFER, *vboId);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glBindBuffer(GL_ARRAY_BUFFER, *tboId);
glVertexAttribPointer(1,2,GL_FLOAT,GL_FALSE,0,0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, *iboId);
glDrawElements(GL_TRIANGLES, (*indices).size(), GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

glDisable(GL_TEXTURE_2D);

四边形已正确创建,但没有纹理显示到。。如何实现我的纹理?在这些情况下,着色器是必需的吗?

无法在固定函数(非着色器)管道中“启用”
GL\u TEXTURE\u BUFFER
纹理目标,因此应排除在没有着色器的情况下使用它们的可能性。你也许可以用1D纹理和像素缓冲区对象做同样的事情,但是这听起来比编写一个简单的着色器要多得多。非常感谢。我将这样启用着色器@如果我能再问你一件事,我必须在同一个加载程序中创建顶点和片段着色器,或者我可以先创建顶点着色器,然后创建片段?这只是我的好奇心,不是性能问题,我不确定我理解你的问题,但是我可以告诉你OpenGL使用了一个叫做“着色器程序”的东西,把它们看作一个C++程序,每个着色器就像一个“.cpp”(翻译单元)文件——你编译它们,然后把它们连接起来,创建一个完成的程序。问题是,OpenGL的原始设计要求将顶点着色器和片段着色器链接到单个程序中。可以在不同的链接程序中重用顶点着色器或片段着色器,但每个链接程序都需要同时包含这两个着色器。
glEnable(GL_TEXTURE_2D);
glhBindTexture(txtr);

glBindBuffer(GL_ARRAY_BUFFER, *vboId);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glBindBuffer(GL_ARRAY_BUFFER, *tboId);
glVertexAttribPointer(1,2,GL_FLOAT,GL_FALSE,0,0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, *iboId);
glDrawElements(GL_TRIANGLES, (*indices).size(), GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

glDisable(GL_TEXTURE_2D);