環境搭建可參考之前在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...