Using shaders

This commit is contained in:
Thomas FORGIONE 2016-11-25 11:27:05 +01:00
parent 160d266aea
commit c744cdd099
8 changed files with 85 additions and 40 deletions

50
controls/Controls.py Normal file
View File

@ -0,0 +1,50 @@
#!/usr/bin/env python3
class Controls:
def __init__(self):
pass
def apply(self):
pass
def update(self, time = 10):
pass
class TrackBallControls(Controls):
def __init__(self):
super().__init__(self)
self.vertex = Vertex()
self.theta = 0
def apply(self):
glRotatef(self.theta * 180 / math.pi, self.vertex.x, self.vertex.y, self.vertex.z)
def update(self, time = 10):
if not pygame.mouse.get_pressed()[0]:
return
coeff = 0.001
move = pygame.mouse.get_rel()
dV = Vertex(move[1] * time * coeff, move[0] * time * coeff, 0)
dTheta = dV.norm2()
if abs(dTheta) < 0.00001:
return
dV.normalize()
cosT2 = math.cos(self.theta / 2)
sinT2 = math.sin(self.theta / 2)
cosDT2 = math.cos(dTheta / 2)
sinDT2 = math.sin(dTheta / 2)
A = cosT2 * sinDT2 * dV + cosDT2 * sinT2 * self.vertex + sinDT2 * sinT2 * Vertex.cross_product(dV, self.vertex)
self.theta = 2 * math.acos(cosT2 * cosDT2 - sinT2 * sinDT2 * Vertex.dot(dV, self.vertex))
self.vertex = A
self.vertex.normalize()

0
controls/__init__.py Normal file
View File

0
conv3d/__init__.py Normal file
View File

View File

@ -9,12 +9,14 @@ import math
from pygame.locals import * from pygame.locals import *
from OpenGL.GL import * from OpenGL.GL import *
from OpenGL.GL.shaders import *
from OpenGL.GLU import * from OpenGL.GLU import *
from OpenGL.GLUT import * from OpenGL.GLUT import *
from conv3d.loadmodel import load_model from conv3d.loadmodel import load_model
from conv3d.model import Vertex from conv3d.model import Vertex
from controls import TrackBallControls
WINDOW_WIDTH = 1024 WINDOW_WIDTH = 1024
WINDOW_HEIGHT = 768 WINDOW_HEIGHT = 768
@ -24,42 +26,6 @@ y = 0.5
width = 1 width = 1
height = 1 height = 1
class TrackBallControls:
def __init__(self):
self.vertex = Vertex()
self.theta = 0
def apply(self):
glRotatef(self.theta * 180 / math.pi, self.vertex.x, self.vertex.y, self.vertex.z)
def update(self, time = 10):
if not pygame.mouse.get_pressed()[0]:
return
coeff = 0.001
move = pygame.mouse.get_rel()
dV = Vertex(move[1] * time * coeff, move[0] * time * coeff, 0)
dTheta = dV.norm2()
if abs(dTheta) < 0.00001:
return
dV.normalize()
cosT2 = math.cos(self.theta / 2)
sinT2 = math.sin(self.theta / 2)
cosDT2 = math.cos(dTheta / 2)
sinDT2 = math.sin(dTheta / 2)
A = cosT2 * sinDT2 * dV + cosDT2 * sinT2 * self.vertex + sinDT2 * sinT2 * Vertex.cross_product(dV, self.vertex)
self.theta = 2 * math.acos(cosT2 * cosDT2 - sinT2 * sinDT2 * Vertex.dot(dV, self.vertex))
self.vertex = A
self.vertex.normalize()
def init_frame(): def init_frame():
@ -88,15 +54,22 @@ def main(args):
glEnable(GL_BLEND) glEnable(GL_BLEND)
glClearColor(0, 0, 0, 0) glClearColor(0, 0, 0, 0)
glLightfv(GL_LIGHT0, GL_POSITION, [10,5,7])
glEnable(GL_LIGHTING)
glEnable(GL_LIGHT0)
running = True running = True
model = load_model(args.input) model = load_model(args.input)
model.generate_vbos() model.generate_vbos()
VERTEX_SHADER = None
FRAGMENT_SHADER = None
with open('shaders/shader.vert') as f:
VERTEX_SHADER = compileShader(f.read(), GL_VERTEX_SHADER)
with open('shaders/shader.frag') as f:
FRAGMENT_SHADER = compileShader(f.read(), GL_FRAGMENT_SHADER)
print(VERTEX_SHADER, FRAGMENT_SHADER)
SHADER = compileProgram(VERTEX_SHADER, FRAGMENT_SHADER)
while running: while running:
for event in pygame.event.get(): for event in pygame.event.get():
if event.type == pygame.QUIT: if event.type == pygame.QUIT:
@ -118,7 +91,9 @@ def main(args):
glPushMatrix() glPushMatrix()
controls.apply() controls.apply()
glUseProgram(SHADER)
model.gl_draw() model.gl_draw()
glUseProgram(0)
glPopMatrix() glPopMatrix()
glFlush() glFlush()

14
shaders/shader.frag Normal file
View File

@ -0,0 +1,14 @@
varying vec3 fNormal;
vec3 ambientLight = vec3(0.2,0.2,0.2);
vec3 directionnalLight = normalize(vec3(10,5,7));
vec3 directionnalLightFactor = vec3(0.5,0.5,0.5);
void main() {
vec3 ambientFactor = ambientLight;
vec3 lambertFactor = max(vec3(0.0,0.0,0.0), dot(directionnalLight, fNormal) * directionnalLightFactor);
gl_FragColor = vec4(ambientFactor + lambertFactor, 1.0);
}

6
shaders/shader.vert Normal file
View File

@ -0,0 +1,6 @@
varying vec3 fNormal;
void main() {
fNormal = gl_Normal;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}