PyOpenGL - Нарисуйте несколько треугольников с разными цветами с помощью VBO

user972014 спросил: 31 июля 2018 в 09:44 в: python

Моя цель - визуализировать сцену со множеством треугольников с разными цветами. Я хочу воспроизвести эту сцену много раз, как можно быстрее, из разных положений камеры и разных углов обзора. Мне удалось объединить несколько образцов и получить код, который рисует один треугольник, используя VBO:

/ p>

import cv2
import numpy as np
import glfw
from OpenGL.GL import shaders
from OpenGL.GLU import *
from OpenGL.arrays import vbo
from OpenGL.GL import *
from OpenGL.raw.GL.ARB.vertex_array_object import glGenVertexArrays, glBindVertexArraydef draw_model():
    vertices = np.array([[0,1,0],[-1,-1,0],[1,-1,0]], dtype=np.float32)
    vertexPositions = vbo.VBO(vertices)
    indices = np.array([[0,2,1]], dtype=np.int32)
    indexPositions = vbo.VBO(indices, target=GL_ELEMENT_ARRAY_BUFFER)
    VERTEX_SHADER = shaders.compileShader("""
    #version 330
    in vec4 position;
    void main()
    {
        gl_Position = position;
    }
    """, GL_VERTEX_SHADER)    FRAGMENT_SHADER = shaders.compileShader("""
    #version 330
    out vec4 outputColor;
    void main()
    {
        outputColor = vec4(0.0f, 1.0f, 0.9f, 1.0f);
    }
    """, GL_FRAGMENT_SHADER)    shader = shaders.compileProgram(VERTEX_SHADER, FRAGMENT_SHADER)
    glUseProgram(shader)
    indexPositions.bind()
    vertexPositions.bind()
    glEnableVertexAttribArray(0)
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, None)
    glDrawArrays(GL_TRIANGLES, 0, 3)# Reads the pixels to NP
def get_display_pixels(rendered_image_width, rendered_image_height):
    data = glReadPixels(0, 0, rendered_image_width, rendered_image_height, OpenGL.GL.GL_RGB, OpenGL.GL.GL_UNSIGNED_BYTE)
    return np.frombuffer(data, dtype=np.uint8).reshape(rendered_image_height, rendered_image_width, 3)[::-1]DISPLAY_WIDTH = 900
DISPLAY_HEIGHT = 900glfw.init()
glfw.window_hint(glfw.VISIBLE, False)
window = glfw.create_window(DISPLAY_WIDTH, DISPLAY_HEIGHT, "some window", None, None)
glfw.make_context_current(window)gluPerspective(90, (DISPLAY_WIDTH / DISPLAY_HEIGHT), 0.01, 30)
glEnable(GL_TEXTURE_2D)
glEnable(GL_DEPTH_TEST)
glDepthFunc(GL_LEQUAL)# Get cube 1
glPushMatrix()
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
draw_model()
cube1 = get_display_pixels(DISPLAY_WIDTH, DISPLAY_HEIGHT)
glPopMatrix()cv2.imwrite(r"C:\temp\image1.png", cube1)glfw.destroy_window(window)
glfw.terminate()

У меня есть несколько проблем с этим кодом:

Кажется странным, что я должен скомпилировать шейдер для рисования простой формы. И кажется более странным перекомпилировать шейдер для каждого цвета, который я хочу использовать.

Я не понимаю, как я могу комбинировать этот код с gluLookAt для моей сцены. Нужно ли перекомпилировать новый шейдер?

1 ответ

Есть решение
user972014 ответил: 03 августа 2018 в 06:02

Решение было достигнуто с помощью униформы, предложенной пользователем BDL в его комментарии. Также возможно установить атрибуты вершин, как предлагается здесь:

http://www.labri.fr/ персидско / nrougier / Python-OpenGL /