OpenGL ve GLSL'ye yeni geliyorum ve http://open.gl/ aracılığıyla öğreniyorum.Hepsinin yerine bir köşe noktasının rengini nasıl değiştirebilirim?
Bir üçgen çizip kullanan tüm köşelerden rengini değiştirmek başardınız:
glUniform3f(uniColor, red, 0.0, 0.0)
"kırmızı" değeri sürekli değişen durumlarda, ancak bu tüm tepe arasındaki renk değeri günceller Üçgenin içinde, sadece bir veya iki köşeyi değiştirmek istiyorum. kod üzerinde Looking
Ben (kod neredeyse tamamen http://open.gl/content/code/c2_triangle_uniform.txt dayanmaktadır) yerine hepsini bir tepe ancak bu kodu
odaklanmak için herhangi bir mantık uygulayabilir nerede görmüyorum: http://open.gl/content/code/c2_color_triangle.txt, her vertex kendi rengini alır, ancak kodlanmış gibi görünüyor, program ilerledikçe renkleri dinamik olarak değiştiremiyorum. Ben
uniColor = glGetUniformLocation(shader.handle, "triangleColor")
tahmin ediyorum
bana değiştirebileceğiniz bir değişkenin yerini verir ve bu değişken tüm köşelerden rengini güncellemek için kullanılır ve bu belki de yapmanız gereken 3 oluşturmaktır değişkenler, her köşe için bir tane ve sonra bunlara erişir, ancak bunu nasıl yaparım?
GLSL'ye bakarsam, "uniform vec3 triangleColor;" bu daha sonra
void main()
{
outColor = vec4(triangleColor, 1.0);
}
kullanılır ama 3 tür triangleColor değişkenler oluşturmak bile nasıl söylerdim void main() Ne değişkeni aldığı köşe ayırt etmek?
kodu:
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()
renkleri içeren ikinci bir arabellek yapın, bu sizin konumlarınızla aynı olmalıdır, ancak köşe gölgelendiricisinde kullanmak yerine, bunları parça gölgelendiricisinde kullanabilirsiniz. –