用python做opengl的编程_python下学习opengl之着色器

1 #! /usr/bin/env python

2 #-*- coding: utf-8 -*-

3

4 importsys, os5 importOpenGL.GL as gl6 importglfw7 importnumpy as np8 from ctypes importc_void_p9

10 WIN_WIDTH = 800

11 WIN_HEIGHT = 600

12

13 vertexShaderSource = """

14 #version 330 core15 layout (location = 0) in vec3 aPos;16 layout (location = 1) in vec3 aColor;17 out vec3 ourColor;18 void main()19 {20 gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);21 ourColor = aColor;22 }23 """

24

25 fragmentShaderSource = """

26 #version 330 core27 out vec4 FragColor;28 in vec3 ourColor;29 void main()30 {31 FragColor = vec4(ourColor, 1.0);32 }33 """

34 vertices = np.array([0.5,-0.5, 0, 1.0, 0, 0,35 -0.5,-0.5, 0, 0, 1.0, 0,36 0.0, 0.5, 0, 0, 0, 1.0], dtype =np.float32)37

38

39 defframebuffer_size_callback(window, width, height):40 gl.glViewport(0, 0, width, height)41

42 defprocessInput(window):43 if glfw.glfwGetKey(window, glfw.GLFW_KEY_ESCAPE) ==glfw.GLFW_PRESS:44 glfw.glfwSetWindowShouldClose()45

46 if glfw.glfwGetKey(window, glfw.GLFW_KEY_LEFT) ==glfw.GLFW_PRESS:47 gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_FILL)48

49 if glfw.glfwGetKey(window, glfw.GLFW_KEY_RIGHT) ==glfw.GLFW_PRESS:50 gl.glPolygonMode(gl.GL_FRONT_AND_BACK, gl.GL_LINE)51

52 defmain():53 glfw.glfwInit()54 glfw.glfwWindowHint(glfw.GLFW_CONTEXT_VERSION_MAJOR, 3)55 glfw.glfwWindowHint(glfw.GLFW_CONTEXT_VERSION_MINOR, 3)56 glfw.glfwWindowHint(glfw.GLFW_OPENGL_PROFILE, glfw.GLFW_OPENGL_CORE_PROFILE)57

58 window = glfw.glfwCreateWindow(WIN_WIDTH, WIN_HEIGHT, "学习OpenGL".encode(), 0, 0)59 if window ==0:60 print("failed to create window")61 glfw.glfwTerminate()62

63 glfw.glfwMakeContextCurrent(window)64 glfw.glfwSetFramebufferSizeCallback(window, framebuffer_size_callback)65

66 vertexShader =gl.glCreateShader(gl.GL_VERTEX_SHADER)67 gl.glShaderSource(vertexShader, vertexShaderSource)68 gl.glCompileShader(vertexShader)69

70 fragmentShader =gl.glCreateShader(gl.GL_FRAGMENT_SHADER)71 gl.glShaderSource(fragmentShader, fragmentShaderSource)72 gl.glCompileShader(fragmentShader)73

74 shaderProgram =gl.glCreateProgram()75 gl.glAttachShader(shaderProgram, vertexShader)76 gl.glAttachShader(shaderProgram, fragmentShader)77 gl.glLinkProgram(shaderProgram)78

79 gl.glDeleteShader(vertexShader)80 gl.glDeleteShader(fragmentShader)81

82 VAO = gl.glGenVertexArrays(1)83 VBO, EBO = gl.glGenBuffers(2)84

85 gl.glBindVertexArray(VAO)86 gl.glBindBuffer(gl.GL_ARRAY_BUFFER, VBO)87 gl.glBufferData(gl.GL_ARRAY_BUFFER, sys.getsizeof(vertices), vertices, gl.GL_STATIC_DRAW)88

89 gl.glVertexAttribPointer(0, 3, gl.GL_FLOAT, gl.GL_FALSE, 24, c_void_p(0))90 gl.glEnableVertexAttribArray(0)91 gl.glVertexAttribPointer(1, 3, gl.GL_FLOAT, gl.GL_FALSE, 24, c_void_p(12))92 gl.glEnableVertexAttribArray(1)93 gl.glBindBuffer(gl.GL_ARRAY_BUFFER, 0)94 gl.glBindVertexArray(0)95

96 while notglfw.glfwWindowShouldClose(window):97 processInput(window)98 gl.glClearColor(0.2, 0.3, 0.3, 1.0)99 gl.glClear(gl.GL_COLOR_BUFFER_BIT)100

101 gl.glUseProgram(shaderProgram)102

103 gl.glBindVertexArray(VAO)104 gl.glDrawArrays(gl.GL_TRIANGLES, 0, 3)105

106 glfw.glfwSwapBuffers(window)107 glfw.glfwPollEvents()108

109 glfw.glfwTerminate()110

111 if __name__ == "__main__":112 main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值