使用Opengl繪製兩個三角形 Python注釋版

2021-10-05 15:19:10 字數 4654 閱讀 6917

環境搭建可參考之前在anaconda下搭建環境一直報錯,後來使用pycharm並將直譯器路徑設定到anaconda下就好了

****於

閱讀了c++板的《opengl程式設計指南(原書第9版).pdf》後,根據理解寫了一些**注釋,有錯誤請指正,謝謝

"""

glfw_********02.py

author: dalong10

description: draw a triagle, learning opengl

"""import glutils #common opengl utilities,see glutils.py

import sys, random, math

import opengl

from opengl.gl import *

from opengl.gl.shaders import *

import numpy

import numpy as np

import glfw

'''做渲染的話,現代opengl需要我們至少設定乙個頂點和乙個片段著色器'''

#vertex shader頂點著色器,資料流入頂點著色器,將輸入的頂點位置複製到頂點著色器的輸出位置gl_position

#vec4(position.x, position.y, position.z, 1.0);------xyzw,座標及縮放比例

strvs = """

#version 330 core

layout(location = 0) in vec3 position;

void main()

"""#fragment shader片段著色器,片段著色器會輸出color資料

#vec4(1.0, 0.0, 0.0, 1.0);------rgba紅綠藍及透明度

strfs1 = """

#version 330 core

out vec4 color;

void main()

"""strfs2 = """

#version 330 core

out vec4 color;

void main()

"""class first********:

def __init__(self, side1, side2, side3):

self.side1 = side1

self.side2 = side2

self.side3 = side3

# load shaders

if side3>0:

strfs=strfs1

else:

strfs=strfs2

#讀取鏈結頂點著色器和片元著色器的源程式字串的函式,為著色器進入gpu的操作專門實現的函式

self.program = glutils.loadshaders(strvs, strfs)

gluseprogram(self.program)

s1 = side1/1.0

s2 = side2/1.0

s3 = side3/1.0

#三角形的三個點

vertices = [

s1, -0.5, 0,#xyzz

s2, -0.5, 0,#xyzz

s3, 0.5, 0 #xyzz

]'''著色管線裝配:將應用程式的資料和著色器程式的變數關聯起來'''

# set up vertex array object (vao)建立1個頂點陣列物件,並將物件名返回,類似cc語言的指標變數

self.vao = glgenvertexarrays(1)

#繫結乙個頂點陣列物件,opengl內部會將其作為當前物件,後面的所有操作都作用於這個物件

glbindvertexarray(self.vao)

# set up vbos

vertexdata = numpy.array(vertices, numpy.float32)

#建立1個頂點快取物件,並將物件名稱返回 與頂點物件類似。快取物件就是opengl服務端分配和管理的一塊記憶體區域

self.vertexbuffer = glgenbuffers(1)

#繫結到opengl環境中,opengl有多種型別,因此繫結時需要指定快取物件的型別gl_array_buffer

glbindbuffer(gl_array_buffer, self.vertexbuffer)

#分配快取物件空間,大小為4*len(vertexdata)位元組,並將vertexdata資料拷貝到opengl的快取中

glbufferdata(gl_array_buffer, 4*len(vertexdata), vertexdata,

gl_static_draw)

'''著色管線裝配:將應用程式與著色器之間,以及不同著色階段之間的資料通道連線起來'''

#enable arrays啟用索引為0的頂點屬性陣列

self.vertindex = 0

glenablevertexattribarray(self.vertindex)

# set buffers

glbindbuffer(gl_array_buffer, self.vertexbuffer)

#0:設定頂點著色器中變數position對應的值 3:每個頂點有xyz3個值

# gl_float:每個元素的資料型別 gl_false:不需要進行歸一化

#0:每兩個資料之間的偏移量為0

#將著色器中的變數position與vertexbuffer關聯起來

glvertexattribpointer(0, 3, gl_float, gl_false, 0, none)

# unbind vao opengl不在使用之前繫結的頂點陣列

glbindvertexarray(0)

'''執行渲染工作'''

def render(self):

# 指定program作為opengl的當前著色器程式

gluseprogram(self.program)

# bind vao指定vao作為opengl的當前頂點物件

glbindvertexarray(self.vao)

# draw

gldrawarrays(gl_********s, 0, 3)

# unbind vao

glbindvertexarray(0)

if __name__ == '__main__':

import sys

import glfw

import opengl.gl as gl

def on_key(window, key, scancode, action, mods):

if key == glfw.key_escape and action == glfw.press:

glfw.set_window_should_close(window,1)

# initialize the library初始化glfw庫

if not glfw.init():

sys.exit()

# create a windowed mode window and its opengl context設定程式所使用的視窗型別及視窗大小,也可以先查詢顯示器的尺寸再設定

window = glfw.create_window(640, 480, "glfw_********02", none, none)

if not window:

glfw.terminate()

sys.exit()

# make the window's context current把建立的window視窗作為opengl顯示的視窗

glfw.make_context_current(window)

# install a key handler

glfw.set_key_callback(window, on_key)

# loop until the user closes the window

while not glfw.window_should_close(window):

# render here

width, height = glfw.get_framebuffer_size(window)

ratio = width / float(height)

gl.glviewport(0, 0, width, height)

gl.glclear(gl.gl_color_buffer_bit)

gl.glclearcolor(0.0,0.0,0.0,0.0)

first********0 = first********(-0.9,-0.0,-0.45)

first********1 = first********(0,0.9,0.45)

# render

first********0.render()

first********1.render()

# swap front and back buffers

glfw.swap_buffers(window)

# poll for and process events

glfw.poll_events()

glfw.terminate()

OpenGL入門之繪製兩個相連的三角形

使用不同的vao和vbo繪製兩個彼此相連的三角形 include include include void framebuffer size callback glfwwindow window,int width,int height void processinput glfwwindow wi...

OpenGL隨筆二 opengl繪製三角形

define glew static 1 include include include vbo繪製兩個共邊的三角形需要六個點 float vertices const char vertexshadersource version 330 core n layout location 0 in v...

OpenGL2 繪製三角形

該例子展示如何使用opengl繪製三角形 為什麼說繪製三角形呢 三維空間裡面,我們看到的機會大多數 漂亮的模型,建築,任務,機會都是有三角形網路組成。可以說三角形 是組成三維的基本元素,所以三角形是繪製最基本的圖元。當然還有,點和線。include include include pragma co...