我是OpenGL和GLSL的新手,並且通過http://open.gl/瞭解它。如何更改一個頂點的顏色而不是所有頂點的顏色?
我已經成功地繪製一個三角形,並使用改變所有頂點的顏色:
glUniform3f(uniColor, red, 0.0, 0.0)
凡「紅」的價值是不斷變化的,但是這個更新所有頂點的顏色值在三角形中,雖然我只想改變一個或兩個頂點。
回顧過去的代碼,我沒有看到,我可以實現任何邏輯集中於一個頂點,而不是所有這些(代碼幾乎完全基於http://open.gl/content/code/c2_triangle_uniform.txt)
然而,在這樣的代碼:http://open.gl/content/code/c2_color_triangle.txt,每個頂點得到它自己的顏色,但它似乎是硬編碼,我不能隨着程序的進展動態改變顏色。
我猜
uniColor = glGetUniformLocation(shader.handle, "triangleColor")
給我一個變量的我可以改變位置,這個變量用於更新所有頂點的顏色,那或許是我需要做的就是創建3變量,每個頂點一個然後訪問這些,但我該怎麼做?
如果我看GLSL,我有一個「uniform vec3 triangleColor;」然後將其在
void main()
{
outColor = vec4(triangleColor, 1.0);
}
使用,但即使我創建3個這樣的triangleColor變量我怎麼會告訴無效的主要()來區分哪個頂點獲得什麼變化?
代碼:
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()
創建第二個包含顏色的緩衝區,它應該與您的位置相同,但不是在頂點着色器中使用它,而是在片段着色器中使用 –