Ставки пока отсутствуют
Ставки пока отсутствуют
-
Руслан С. 12 декабря 2023from OpenGL.GL import *
from OpenGL.GLUT import *
from OpenGL.GLU import *
from OpenGL.GL import shaders
import numpy as np
import math
light0_ambient = [0.2, 0.2, 0.2, 1.0]
light0_diffuse = [0.0, 0.0, 0.0, 1.0]
light1_diffuse = [1.0, 0.0, 0.0, 1.0]
light1_position = [1.0, 1.0, 1.0, 0.0]
light2_diffuse = [0.0, 1.0, 0.0, 1.0]
light2_position = [-1.0, -1.0, 1.0, 0.0]
s = 0.0
angle1 = 0.0
angle2 = 0.0
vertex_shader_source = """
#version 120
attribute vec3 position;
varying vec3 normal;
void main() {
gl_Position = gl_ModelViewProjectionMatrix * vec4(position, 1.0);
normal = gl_NormalMatrix * gl_Normal;
}
"""
fragment_shader_source = """
#version 120
varying vec3 normal;
uniform vec4 light_diffuse;
uniform vec4 material_ambient;
uniform vec4 material_diffuse;
void main() {
vec3 normal_normalized = normalize(normal);
vec3 light_direction = normalize(vec3(gl_LightSource[0].position));
float intensity = max(dot(light_direction, normal_normalized), 0.0);
vec4 diffuse = light_diffuse * material_diffuse * intensity;
gl_FragColor = material_ambient + diffuse;
}
"""
shader_program = None
def compile_shader(shader_type, source):
shader = glCreateShader(shader_type)
glShaderSource(shader, source)
glCompileShader(shader)
if glGetShaderiv(shader, GL_COMPILE_STATUS) != GL_TRUE:
raise RuntimeError(glGetShaderInfoLog(shader))
return shader
def create_shader_program(vertex_source, fragment_source):
vertex_shader = compile_shader(GL_VERTEX_SHADER, vertex_source)
fragment_shader = compile_shader(GL_FRAGMENT_SHADER, fragment_source)
program = glCreateProgram()
glAttachShader(program, vertex_shader)
glAttachShader(program, fragment_shader)
glLinkProgram(program)
if glGetProgramiv(program, GL_LINK_STATUS) != GL_TRUE:
raise RuntimeError(glGetProgramInfoLog(program))
glDeleteShader(vertex_shader)
glDeleteShader(fragment_shader)
return program
def init_shaders():
global shader_program
shader_program = create_shader_program(vertex_shader_source, fragment_shader_source)
glUseProgram(shader_program)
def set_uniforms():
glUniform4fv(glGetUniformLocation(shader_program, "light_diffuse"), 1, light1_diffuse)
glUniform4fv(glGetUniformLocation(shader_program, "material_ambient"), 1, light0_ambient)
glUniform4fv(glGetUniformLocation(shader_program, "material_diffuse"), 1, light0_diffuse)
def display():
global angle1, angle2, s
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glEnable(GL_DEPTH_TEST)
glPushMatrix()
glTranslatef(-0.3, -0.3, 0.0)
glRotatef(angle1, 1.0, 5.0, 0.0)
glutSolidIcosahedron()
glPopMatrix()
glPushMatrix()
glTranslatef(0.3, 0.3, 0.0)
glRotatef(angle2, 1.0, 0.0, 5.0)
glutSolidIcosahedron()
glPopMatrix()
glutSwapBuffers()
def idle():
global angle1, angle2, s
angle1 = (angle1 + 0.8) % 360.0
angle2 = (angle2 + 1.1) % 360.0
s += 0.05
glutPostRedisplay()
def visible(vis):
if vis == GLUT_VISIBLE:
glutIdleFunc(idle)
else:
glutIdleFunc(None)
def reshape(width, height):
glViewport(0, 0, width, height)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(40.0, float(width) / float(height), 1.0, 10.0)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
gluLookAt(0.0, 0.0, 5.0,
0.0, 0.0, 0.0,
0.0, 1.0, 0.0)
glTranslatef(0.0, 0.6, -1.0)
def main():
global angle1, angle2, s
glutInit()
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)
glutCreateWindow("blender")
glutDisplayFunc(display)
glutVisibilityFunc(visible)
glutReshapeFunc(reshape)
init_shaders()
set_uniforms()
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
glEnable(GL_DEPTH_TEST)
glutMainLoop()
return 0
if __name__ == "__main__":
main()
електронний мозок пропонує таке