Python GLM OpenGL

基于Python的OpenGL 04 之变换

本文基于Python语言,描述OpenGL的变换

1. 概述

本文基于Python语言,描述OpenGL的变换

前置知识可参考:

  • 基于Python的OpenGL 03 之纹理 - 当时明月在曾照彩云归 - 博客园 [cnblogs. com]

笔者这里不过多描述每个名词、函数和细节,更详细的文档可以参考:

  • 变换 - LearnOpenGL CN [learnopengl-cn. github. i]

2. 导入GLM

平移、旋转、缩放等变换主要是使用变换矩阵来实现

OpenGL Mathematics[GLM]是一个基于GLSL的只有头文件的C++数学运算库

GLM的GitHub站点为:g-truc/glm. Toán học OpenGL [GLM] [github. com]

PyGLM是GLM的Python绑定,其API基本一致

PyGLM的GitHub站点为:Zuzu-Typ/PyGLM. Toán học OpenGL nhanh [GLM] cho Python [github. com]

PyGLM的PyPi地址为:PyGLM · PyPI

使用pip安装PyGLM:

pip install PyGLM

引入GLM:

import glm

3. 设置变换矩阵

设置一个平移、旋转、缩放的矩阵:

trans = glm.mat4[1.0]
trans = glm.translate[trans, glm.vec3[0.5, -0.5, 0.0]*np.sin[glfw.get_time[]]]
trans = glm.rotate[trans, glfw.get_time[], glm.vec3[0.0, 0.0, 1.0]]
trans = glm.scale[trans, glm.vec3[1.0, 1.0, 0.0]*[np.sin[glfw.get_time[]]*0.5+0.5]]

在顶点着色器中将变换矩阵与坐标结合:

#version 330 core
layout [location = 0] in vec3 aPos;
layout [location = 1] in vec3 aColor;
layout [location = 2] in vec2 aTexCoord;

out vec3 ourColor;
out vec2 TexCoord;

uniform mat4 transform;

void main[]
{
    gl_Position = transform * vec4[aPos, 1.0];
    ourColor = aColor;
    TexCoord = aTexCoord;
}

将变换矩阵输入到GPU:

glUniformMatrix4fv[glGetUniformLocation[shader.shaderProgram, 'transform'], 1, GL_FALSE, glm.value_ptr[trans]]

如果顺利的话,结果如下:

4. 完整代码

主要文件

import glm
0:

import glfw as glfw
from OpenGL.GL import *
import numpy as np
from PIL.Image import open
import glm as glm

import shader as shader

glfw.init[]
window = glfw.create_window[800, 600, "transformation", None, None]
glfw.make_context_current[window]

VAO = glGenVertexArrays[1]
glBindVertexArray[VAO]

vertices = np.array[[
     # ---- 位置 ----       ---- 颜色 ----     - 纹理坐标 -
     0.5,  0.5, 0.0,   1.0, 0.0, 0.0,   1.0, 1.0,   # 右上
     0.5, -0.5, 0.0,   0.0, 1.0, 0.0,   1.0, 0.0,   # 右下
    -0.5, -0.5, 0.0,   0.0, 0.0, 1.0,   0.0, 0.0,   # 左下
    -0.5,  0.5, 0.0,   1.0, 1.0, 0.0,   0.0, 1.0,   # 左上
                    ]]
VBO = glGenBuffers[1]
glBindBuffer[GL_ARRAY_BUFFER, VBO]
glBufferData[GL_ARRAY_BUFFER, 8 * vertices.size, vertices, GL_STATIC_DRAW]
glVertexAttribPointer[0, 3, GL_DOUBLE, GL_FALSE, int[8 * 8], None]
glEnableVertexArrayAttrib[VAO, 0]
glVertexAttribPointer[1, 3, GL_DOUBLE, GL_FALSE, int[8 * 8], ctypes.c_void_p[8 * 3]]
glEnableVertexArrayAttrib[VAO, 1]
glVertexAttribPointer[2, 2, GL_DOUBLE, GL_FALSE, int[8 * 8], ctypes.c_void_p[8 * 6]]
glEnableVertexAttribArray[2]

indices = np.array[[
        0, 1, 3,  # first triangle
        1, 2, 3  # second triangle
        ]]
EBO = glGenBuffers[1]
glBindBuffer[GL_ELEMENT_ARRAY_BUFFER, EBO]
glBufferData[GL_ELEMENT_ARRAY_BUFFER, 8 * indices.size, indices, GL_STATIC_DRAW]

image = open['./textures/container.jpg']
texture = glGenTextures[1]
glBindTexture[GL_TEXTURE_2D, texture]
# 为当前绑定的纹理对象设置环绕、过滤方式
glTexParameteri[GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT]
glTexParameteri[GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT]
glTexParameteri[GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR]
glTexParameteri[GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR]
glTexImage2D[GL_TEXTURE_2D, 0, GL_RGB, image.size[0], image.size[1], 0, GL_RGB, GL_UNSIGNED_BYTE, image.tobytes[]]
glGenerateMipmap[GL_TEXTURE_2D]

shader = shader.Shader["./glsl/test.vs.glsl", "./glsl/test.fs.glsl"]

while not glfw.window_should_close[window]:
    glClearColor[0.2, 0.3, 0.3, 1.0]
    glClear[GL_COLOR_BUFFER_BIT]

    trans = glm.mat4[1.0]
    trans = glm.translate[trans, glm.vec3[0.5, -0.5, 0.0]*np.sin[glfw.get_time[]]]
    trans = glm.rotate[trans, glfw.get_time[], glm.vec3[0.0, 0.0, 1.0]]
    trans = glm.scale[trans, glm.vec3[1.0, 1.0, 0.0]*[np.sin[glfw.get_time[]]*0.5+0.5]]

    shader.use[]
    glUniformMatrix4fv[glGetUniformLocation[shader.shaderProgram, 'transform'], 1, GL_FALSE, glm.value_ptr[trans]]

    glBindVertexArray[VAO]
    glActiveTexture[GL_TEXTURE0]  # 在绑定纹理之前先激活纹理单元
    glBindTexture[GL_TEXTURE_2D, texture]
    # glDrawArrays[GL_TRIANGLES, 0, 3]
    glDrawElements[GL_TRIANGLES, 6, GL_UNSIGNED_INT, None]

    glfw.swap_buffers[window]
    glfw.poll_events[]

shader.delete[]

顶点着色器

import glm
1:

#version 330 core
layout [location = 0] in vec3 aPos;
layout [location = 1] in vec3 aColor;
layout [location = 2] in vec2 aTexCoord;

out vec3 ourColor;
out vec2 TexCoord;

uniform mat4 transform;

void main[]
{
    gl_Position = transform * vec4[aPos, 1.0];
    ourColor = aColor;
    TexCoord = aTexCoord;
}

片段着色器

import glm
0:

________số 8
  • import glm
    
    1见:基于Python的OpenGL 02 之着色器 - 当时明月在曾照彩云归 - 博客园 [cnblogs. com]

5. 参考资料

[1]变换 - LearnOpenGL CN [learnopengl-cn. github. i]

[2]glm/thủ công. md tại master · g-truc/glm [github. com]

[3]OpenGL学习笔记三——引入GLM库,实现transform_绿洲守望者的博客-CSDN博客_glm库

[4]OpenGL学习笔记(五)纹理 - 知乎 [zhihu. com]

[5]PyGLM · PyPI

[6]Tìm hiểu OpenGL-Python/các phép biến đổi. py ở bậc thầy · Zuzu-Typ/LearnOpenGL-Python [github. com]

作者:当时明月在曾照彩云归

出处:https. //www. cnblog. com/jiujiubashiyi/p/16564571. html

đã đăng @ 2022-08-09 00. 59   当时明月在曾照彩云归  阅读[ 63 ]  评论[ 0 ]  编辑  收藏  举报

GLM viết tắt của OpenGL là gì?

1. Toán học OpenGL [GLM] Toán học OpenGL [GLM] là một thư viện toán học C++ dựa trên đặc tả Ngôn ngữ tô bóng OpenGL [GLSL]. GLM mô phỏng cách tiếp cận của GLSL đối với hoạt động vectơ/ma trận bất cứ khi nào có thể. Để sử dụng GLM, hãy bao gồm glm/glm. hpp

GLM có phải là một thư viện tốt không?

Thư viện này hoạt động hoàn hảo với OpenGL nhưng nó cũng đảm bảo khả năng tương tác với các thư viện và SDK bên thứ ba khác. Nó là một ứng cử viên sáng giá cho kết xuất phần mềm [Raytracing / Rasterisation], xử lý hình ảnh, mô phỏng vật lý và bất kỳ ngữ cảnh nào yêu cầu thư viện toán học đơn giản và thuận tiện

GLM có phải là thư viện tiêu đề không?

GLM is a header only library, there is nothing to build to use it which increases its cross platform capabilities. To use GLM, a programmer only has to include . This provides all the GLSL features implemented by GLM.

Chủ Đề