Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.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_Glsl_Fragment Shader - Fatal编程技术网

C++ 在opengl中通过纹理传递数组数据

C++ 在opengl中通过纹理传递数组数据,c++,opengl,glsl,fragment-shader,C++,Opengl,Glsl,Fragment Shader,所以我尝试将一组向量传递给片段着色器,显然我应该使用1d纹理。但是如果我试图访问传递的向量,那么这些值就不是我所期望的 如何为texture()函数编制索引 传递纹理: std::向量三角形; //三角形已由该点填充 玻璃纹理(GL_纹理0); glBindTexture(GL_纹理_1D,纹理); glTexParameteri(GL_纹理1D,GL_纹理最小过滤器,GL_最近); GLTEXAGE1D(GL_纹理_1D,0,GL_RGB16F,对象::triangles.size(),0,G

所以我尝试将一组向量传递给片段着色器,显然我应该使用1d纹理。但是如果我试图访问传递的向量,那么这些值就不是我所期望的

如何为texture()函数编制索引

传递纹理:

std::向量三角形;
//三角形已由该点填充
玻璃纹理(GL_纹理0);
glBindTexture(GL_纹理_1D,纹理);
glTexParameteri(GL_纹理1D,GL_纹理最小过滤器,GL_最近);
GLTEXAGE1D(GL_纹理_1D,0,GL_RGB16F,对象::triangles.size(),0,GL_RGB,GL_FLOAT,&对象::triangles[0]);
GLint textureLoc=glGetUniformLocation(getId(),“三角形”);
glUniform1f(textureLoc,0);
setUniform((int)对象::triangles.size(),“triCount”);
glBindVertexArray(vao);
gldrawArray(GL_三角形_扇,0,4);
//从-1,-1到1,1绘制一个矩形
片段着色器代码:

统一采样1d三角形;
统一整数倒数;
结构三角形{
vec3 a,b,c;
vec3正常;
};
void main(){
对于每个三角形(int i=0;i
数组包含3个点和一组三角形的法向量,这就是为什么我以这种方式读取纹理

编辑: glGetTexImage确认传递的纹理是正确的。

使用时,纹理坐标是浮点值​​在[0.0,1.0]范围内。用于从具有[0,宽度]范围内的整体纹理坐标的纹理执行单个纹理的查找:

triangle.a=texelFetch(三角形,i*4,0).xyz;
三角形.b=texelFetch(三角形,i*4+1,0).xyz;
三角形.c=texelFetch(三角形,i*4+2,0).xyz;
triangle.normal=texelFetch(三角形,i*4+3,0).xyz;
请注意,着色器代码中Texel索引的计算是不正确的


或者,您可以通过将索引除以纹理的宽度来计算纹理坐标。纹理的大小可以通过以下公式获得:

float width=float(纹理化(三角形,0));
triangle.a=纹理(三角形,(浮动(i*4)+0.5)/宽度).xyz;
三角形.b=纹理(三角形,(浮动(i*4)+1.5)/宽度).xyz;
三角形.c=纹理(三角形,(浮动(i*4)+2.5)/宽度).xyz;
三角形。法线=纹理(三角形,(浮动(i*4)+3.5)/宽度).xyz;
使用时,纹理坐标是浮点值​​在[0.0,1.0]范围内。用于从具有[0,宽度]范围内整数纹理坐标的纹理中查找单个纹理:

triangle.a=texelFetch(三角形,i*4,0).xyz;
三角形.b=texelFetch(三角形,i*4+1,0).xyz;
三角形.c=texelFetch(三角形,i*4+2,0).xyz;
triangle.normal=texelFetch(三角形,i*4+3,0).xyz;
请注意,着色器代码中Texel索引的计算是不正确的


或者,您可以通过将索引除以纹理的宽度来计算纹理坐标。纹理的大小可以通过以下公式获得:

float width=float(纹理化(三角形,0));
triangle.a=纹理(三角形,(浮动(i*4)+0.5)/宽度).xyz;
三角形.b=纹理(三角形,(浮动(i*4)+1.5)/宽度).xyz;
三角形.c=纹理(三角形,(浮动(i*4)+2.5)/宽度).xyz;
三角形。法线=纹理(三角形,(浮动(i*4)+3.5)/宽度).xyz;