是否可以将gluLookAt与顶点着色器一起使用?

2024-10-03 02:46:10 发布

您现在位置:Python中文网/ 问答频道 /正文

经过相当长时间的谷歌会议,我已经足够了!在

我有一个python/opengl应用程序和一些简单的Quad,我使用gluLookAt在场景中移动。然后我只需要在其中一个四边形上添加一个纹理,所以我现在显然对这个四边形使用了一个着色器程序。在

现在当我使用gluLookAt时,带纹理的四边形不会移动,我也能理解。在

现在有没有任何方法可以让gluLookAt函数与着色器程序一起工作,得到当前的矩阵堆栈,这样我就可以为着色器程序提供它了,还是必须重写hole应用程序并重新创建gluLookAt函数like he did(在着色器中还是在CPU上)?在

编辑1: 我使用:

EDIT2(我的解决方案):

自从我打开这个帖子,有些事情发生了变化,但是在你的指导下,我设法得到了一个现代而稳定的解决方案。在

有三个主要的组成部分,我必须画。一个静态场,一些线(为了更好的视觉效果)和一些可移动的四边形。在

该字段现在写入数组中的VBO一次。(与单个绘图命令相比有重大改进)

可移动的正方形和线条的工作原理相同,但它们是动态的,必须与每个帧一起重新加载。在

对于每种类型的物体,我有一个顶点+碎片着色器程序。我知道我可以用一个大的,但这不是它应该的。在

将每个矩阵(模型、视图、投影)指定给统一矩阵,然后将其与顶点着色器中VBO中的顶点相乘。在

场顶点着色器(示例):

#version 330

uniform mat4 uniform_Model;
uniform mat4 uniform_View;
uniform mat4 uniform_Projection;

in vec3 Quad_Color_Attrib;
in vec3 Quad_Size_Attrib;

out vec3 frag_ColorId;

void main()
{
    // Pass the tex coord straight through to the fragment shader
    frag_ColorId = Quad_Color_Attrib;

    // Remember : inverted !
    gl_Position = uniform_Projection * uniform_View * uniform_Model * vec4(Quad_Size_Attrib,1);
}

我要求的不是正确的方法。(新旧OpenGL的结合) 不幸的是,我无法共享孔代码,但我在这里您可以找到所有opengl密钥代码:

顶点/碎片着色器程序加载程序:

Link to a gist

初始化顶点/片段着色器(在本例中为字段)

^{pr2}$

屏幕绘制周期

这只是psydo代码:

OpenGLEnv.Clear()
OpenGLEnv.SetCamera()
OpenGLEnv.DrawField()
OpenGLEnv.FlipBuffer()

所以SetCamera set就是ViewMat和ProjectionMat。在

def SetCamera(self, camera, zoom_distance):
    self.m_ViewMat = lookAt(glm.vec3(-camera[0], -camera[1], zoom_distance),  # Camera is at (x,x,x), in World Space
                            glm.vec3(-camera[0], -camera[1], -100),  # and looks at the origin
                            glm.vec3(0, 1, 0)) #  Head is up (set to 0,-1,0 to look upside-down)
    self.m_ProjectionMat = perspective(45, self.m_AspectRatio, 1, 1000.0)

绘制字段例程

通过这个函数,我将从VBO绘制顶点。在

def DrawField(self):
    glUseProgram(self.m_FieldShader)       # Use shader

    self.m_ModelMat = glm.mat4(1)  # Reset ModelMat
    # ############################
    # 1. Scale          self.ModelMat = scale(self.ModelMat,glm.vec3(10,10,10))
    # 2. Rotation       self.ModelMat = rotate(self.ModelMat, self.test, glm.vec3(0,1,0))
    # 3. Translate      self.ModelMat = translate(self.ModelMat,glm.vec3(0,0,0))
    ####################################

    glUniformMatrix4fv(self.m_Field_ModelMat_Uniform, 1, GL_FALSE, numpy.squeeze(numpy.asarray(self.m_ModelMat.value)))
    glUniformMatrix4fv(self.m_Field_ViewMat_Uniform, 1, GL_FALSE, numpy.squeeze(numpy.asarray(self.m_ViewMat.value)))
    glUniformMatrix4fv(self.m_Field_ProjectionMat_Uniform, 1, GL_FALSE, numpy.squeeze(numpy.asarray(self.m_ProjectionMat.value)))

    glBindVertexArray(self.m_FieldVAO)
    glBindBuffer(GL_ARRAY_BUFFER, self.m_FieldVBO)

    # Draw Field
    glDrawArrays(GL_QUADS, 0, 4*self.m_FieldCount)

    # Disable shader and unbind VAO
    glBindVertexArray(0)
    glUseProgram(0)

旧库:


Tags: toself程序numpyuniformcamera着色器顶点
1条回答
网友
1楼 · 发布于 2024-10-03 02:46:10

您可以决定:

  1. 你可以使用opengl2,这使得事情变得更简单,意味着没有着色器编程,但效率更低。

  2. 如果必须绘制至少1000个三角形,或者希望添加凹凸贴图或其他特殊效果,则可能应该考虑使用着色器。 这意味着:

  3. 如果您的目标是提高效率,请不要使用Python和Pyopengl(自己的经验)

    • 我建议您使用Java和jogl(我目前的配置)。那我就可以给你我的摄影课了。在
  4. 我可能也会将我的camera类移植到Python,但这取决于jogl Matrix4类等等,但是如果pyopengl也提供了这个数学助手类(Matrix4、四元数等)

编辑:

顶点着色器:

#version 330

uniform mat4 uniform_Transformation;
uniform mat4 uniform_Modelview;
uniform mat4 uniform_Projection;

in vec4 attribute_Position;
in vec4 texcoords;

out vec4 texcoords_pass;

void main(void) 
{ 
  texcoords_pass=texcoords;
  vec4 transformedPoint=attribute_Position*uniform_Transformation;
  vec4 toCamera=transformedPoint*uniform_Modelview;
  gl_Position = vec4(toCamera*uniform_Projection);
}

碎片着色器:

^{pr2}$

关于矩阵:

  • uniform_Transformation是转换矩阵。它被用来旋转,缩放,翻转,镜像和移动你的模型,在你的情况下四边形。

  • uniform_Modelview是视图矩阵。基本上就是摄像机。它定义了相机的旋转方式和位置。

  • uniform_Projection是投影矩阵。关于透视投影。请在此处阅读更多信息:http://www.songho.ca/opengl/gl_projectionmatrix.html

希望有帮助!在

相关问题 更多 >