Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.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
如何在python中使用glDrawArrayInstanced?_Python_Opengl_Glsl_Shader_Pyopengl - Fatal编程技术网

如何在python中使用glDrawArrayInstanced?

如何在python中使用glDrawArrayInstanced?,python,opengl,glsl,shader,pyopengl,Python,Opengl,Glsl,Shader,Pyopengl,我有一个python-OpenGL应用程序,在其中我试图同时渲染多个对象,但没有任何运气。出于某种原因,无论我如何更改偏移,都只绘制一个对象。这是我的片段着色器: self.vertex\u着色器\u source=b”“” #330版 布局中(位置=0)vec3位置; 布局中(位置=1)vec2纹理词; 布局中(位置=2)矢量3法线; 均匀的mat4光; 均匀mat4投影; 统一mat4视图; 统一mat4模型; 均匀旋转; 统一mat4翻译; 均匀mat4标度; 均匀vec2偏移量[2];

我有一个python-OpenGL应用程序,在其中我试图同时渲染多个对象,但没有任何运气。出于某种原因,无论我如何更改偏移,都只绘制一个对象。这是我的片段着色器:

self.vertex\u着色器\u source=b”“”
#330版
布局中(位置=0)vec3位置;
布局中(位置=1)vec2纹理词;
布局中(位置=2)矢量3法线;
均匀的mat4光;
均匀mat4投影;
统一mat4视图;
统一mat4模型;
均匀旋转;
统一mat4翻译;
均匀mat4标度;
均匀vec2偏移量[2];
输出vec2纹理;
out vec3框架规范;
void main()
{
fragNormal=(光*vec4(法线,0.0f)).xyz;
vec2 offset=偏移量[gl_InstanceID];
gl_位置=投影*视图*模型*旋转*平移*比例*矢量4(位置+(偏移,0),1.0f);
纹理=vec2(textureCoords.x,1-textureCoords.y);
}
"""
self.fragment\u着色器\u source=b”“”
#330版
在vec2纹理中;
在vec3框架下;
均匀取样器;
外显vec4外显色;
void main()
{
vec3环境光强度=vec3(0.9f,0.9f,0.9f);
vec3太阳光强度=vec3(0.0f,0.2f,0.0f);
vec3日光方向=规格化(vec3(0.0f,0.0f,0.0f));
vec4 texel=纹理(sampTexture,纹理);
vec3 lightIntensity=环境光强度+日光强度*fragNormal*最大值(点(fragNormal,日光方向),0.0f);
outColor=vec4(texel.rgb*光强度,texel.a);
}
"""
编译后,我就是这样设置环境的:

self.vertex\u array\u object=glgenvertexarray(1)
glBindVertexArray(自顶点数组对象)
顶点缓冲区对象=GLuint(0)
glGenBuffers(1,顶点\缓冲区\对象)
glBindBuffer(GL_数组_缓冲区、顶点_缓冲区_对象)
glBufferData(GL_数组_缓冲区,len(self.object.model)*4,self.object.c_模型,GL_静态_绘图)
#顶点
顶点偏移=0
glVertexAttributePointer(0,3,GL_浮点,GL_假,self.object.model.itemsize*3,ctypes.c_void_p(顶点偏移))
GlenableVertexAttributeArray(0)
#质地
纹理偏移=len(self.object.vertex\u索引)*12
glVertexAttribute指针(1,2,GL_浮点,GL_假,self.object.model.itemsize*2,ctypes.c_void_p(纹理偏移))
GlenableVertexAttributeArray(1)
#常态
法线偏移=纹理偏移+透镜(self.object.texture\u索引)*8
glvertexattributepointer(2,3,GL_FLOAT,GL_FALSE,self.object.model.itemsize*3,ctypes.c_void_p(正常偏移))
GlenableVertexAttributeArray(2)
/*纹理贴图*/
view=pyrr.matrix44.create_from_translation(pyrr.Vector3([0.0,0.0,-3.0])).flatten()
投影=pyrr.matrix44.创建透视投影矩阵(80.01280/720,0.1100.0).展平()
model=pyrr.matrix44.create_from_translation(pyrr.Vector3([2.0,-0.5,-1.7])。flatten()
translate=pyrr.matrix44.根据翻译创建(pyrr.Vector3([0,-0.15,0])。展平()
scale=pyrr.matrix44.从_scale(pyrr.Vector3([0,0,0])创建_.展平()
light=pyrr.matrix44.根据翻译创建(pyrr.Vector3([2.0,10.5,1.7])。展平()
self.rot\u y=pyr.Matrix44.from\u y\u旋转(0).flatten()
c_视图=(GLfloat*len(视图))(*视图)
c_投影=(GLfloat*len(投影))(*投影)
c_模型=(GLfloat*len(模型))(*模型)
c_translate=(GLfloat*len(translate))(*translate)
c_标度=(GLfloat*len(translate))(*translate)
c_rotate=(GLfloat*len(self.rot_y))(*self.rot_y)
c_灯=(GLfloat*len(灯))(*灯)
self.rotate_location=glGetUniformLocation(self.shader,b“rotate”)
self.translate_location=glGetUniformLocation(self.shader,b“translate”)
self.scale_location=glGetUniformLocation(self.shader,b“scale”)
self.view_location=glGetUniformLocation(self.shader,b“视图”)
self.proj_location=glGetUniformLocation(self.shader,b“投影”)
self.model_location=glGetUniformLocation(self.shader,b“model”)
self.light_location=glGetUniformLocation(self.shader,b“light”)
self.offset_location=glGetUniformLocation(self.shader,b“offset”)
glUniformMatrix4fv(self.view\u位置,1,GL\u假,c\u视图)
glUniformMatrix4fv(自项目位置,1,GL错误,c投影)
glUniformMatrix4fv(self.model_location,1,GL_FALSE,c_model)
glUniformMatrix4fv(自平移位置,1,GL\u假,c\u平移)
glUniformMatrix4fv(自标度位置,1,GL\u假,c\u标度)
glUniformMatrix4fv(自旋转位置,1,GL\u假,c\u旋转)
glUniformMatrix4fv(自发光位置,1,GLU假,c光)
我尝试设置偏移向量,如

offset=[(0,0)、(10,10)]
并使用glUniform2fv将其传递给着色器,但这只显示一个对象(我现在只需要2个)。以下是我绘制对象的方式:

glBindVertexArray(self.vertex\u数组\u对象)
glDrawArraysInstanced(GL_三角形,0,len(self.object.vertex_索引),2)
glBindVertexArray(0)

顶点着色器在语义上不正确。您必须使用类型为
vec2
的变量偏移量构建
vec3

vec4(位置+(偏移量,0),1.0f)

vec4(位置+vec3(偏移量,0.0),1.0)
实际上,您已经使用了sequence(
)操作符。见:

[…]序列(,)运算符,通过返回以逗号分隔的表达式列表中最右边表达式的类型和值对表达式进行操作

因此
位置+(偏移量,0)
的结果与
位置+0的结果相同


用于设置制服:

self.offset\u location=glGetUniformLocation(self.shader,b“offset”)
glUniform2fv(自偏移位置,2[x0,y0,x1,y1])
或者,您可以单独设置阵列中的制服:

self.offset\u 0\u location=glGetUniformLocation(self.shader,b“offset[0]”)
glUniform2f(自偏移0位置,x0,y0)
self.offset_1_location=glGetUniformLocation(self.shader,b“offset[1]”)
glUniform2f(自偏移1位置,x1,y1)

此外,