Ich bin neu zu OpenGL und GLSL, und ich lerne es durch http://open.gl/. mitWie ändere ich die Farbe eines Scheitelpunkts statt aller?
Ich habe es geschafft, ein Dreieck zu zeichnen und die Farbe aller Scheiteln ändern:
glUniform3f(uniColor, red, 0.0, 0.0)
Wenn der Wert von „Rot“ ändert sich ständig, aber diese aktualisiert den Farbwert aller Scheiteln im Dreieck, während ich nur ein oder zwei der Eckpunkte ändern möchte.
den Code Mit Blick auf Ich sehe nicht, wo ich jede Logik implementieren kann auf eine Ecke zu konzentrieren, anstatt von allen (der Code fast vollständig auf http://open.gl/content/code/c2_triangle_uniform.txt basiert)
In diesem Code aber: http://open.gl/content/code/c2_color_triangle.txt, die jeweils Vertex bekommt seine eigene Farbe, aber es scheint hart codiert zu sein, ich kann die Farben nicht dynamisch ändern, während das Programm fortschreitet.
Ich vermute, ich
uniColor = glGetUniformLocation(shader.handle, "triangleColor")
gibt mir die Lage einer Variablen I und diese Variable verwendet wird, ändern die Farbe aller Scheiteln zu aktualisieren, und dass vielleicht das, was ich tun muss, ist 3 erstellen Variablen, eine für jeden Eckpunkt und dann Zugriff auf diese, aber wie mache ich das?
Wenn ich mir die GLSL ansehe habe ich eine "uniform vec3 triangleColor;" die dann in
void main()
{
outColor = vec4(triangleColor, 1.0);
}
verwendet, aber auch wenn ich 3 so triangleColor Variablen zu erstellen, wie würde ich sagen void main() zu unterscheiden, welche Vertex erhält, welche Variable?
Der Code:
import pyglet
from pyglet.gl import *
from shader import Shader
from ctypes import pointer, sizeof
import math
import time
window = pyglet.window.Window(800, 600, "OpenGL")
window.set_location(100, 100)
# Vertex Input
## Vertex Array Objects
vao = GLuint()
glGenVertexArrays(1, pointer(vao))
glBindVertexArray(vao)
## Vertex Buffer Object
vbo = GLuint()
glGenBuffers(1, pointer(vbo)) # Generate 1 buffer
vertices = [0.0, 0.5,
0.5, -0.5,
-0.5, -0.5]
## Convert the verteces array to a GLfloat array, usable by glBufferData
vertices_gl = (GLfloat * len(vertices))(*vertices)
## Upload data to GPU
glBindBuffer(GL_ARRAY_BUFFER, vbo)
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices_gl), vertices_gl, GL_STATIC_DRAW)
# Shaders (Vertex and Fragment shaders)
vertex = """
#version 150
in vec2 position;
void main()
{
gl_Position = vec4(position, 0.0, 1.0);
}
"""
fragment = """
#version 150
uniform vec3 triangleColor;
out vec4 outColor;
void main()
{
outColor = vec4(triangleColor, 1.0);
}
"""
## Compiling shaders and combining them into a program
shader = Shader(vertex, fragment)
shader.bind() #glUseProgram
# Making the link between vertex data and attributes
## shader.handle holds the value of glCreateProgram()
posAttrib = glGetAttribLocation(shader.handle, "position")
glEnableVertexAttribArray(posAttrib)
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0)
uniColor = glGetUniformLocation(shader.handle, "triangleColor")
# Set clear color
glClearColor(0.0, 0.0, 0.0, 1.0)
@window.event
def on_draw():
# Set the color of the triangle
red = (math.sin(time.clock() * 4.0) + 1.0)/2.0
glUniform3f(uniColor, red, 0.0, 0.0)
# Clear the screen to black
glClear(GL_COLOR_BUFFER_BIT)
# Draw a triangle from the 3 vertices
glDrawArrays(GL_TRIANGLES, 0, 3)
@window.event
def on_key_press(symbol, modifiers):
pass
@window.event
def on_key_release(symbol, modifiers):
pass
def update(dt):
pass
pyglet.clock.schedule(update)
pyglet.app.run()
machen Sie einen zweiten Puffer, der Farben enthält, er sollte Ihren Stellungen entsprechen, aber anstatt sie im Vertex-Shader zu verwenden, verwenden Sie sie im Fragment-Shader –