moderngl безголовый привет мир дает неожиданные результаты - PullRequest
0 голосов
/ 13 марта 2020

У меня очень странная проблема с последней версией moderngl при работе в автономном режиме. Следующий код должен дать мне треугольник, который касается краев области просмотра справа и сверху, но вместо этого правая и верхняя вершины выходят за пределы области просмотра на некоторый нечетный коэффициент 1,98 или около того. Изменение значений x и y, скажем, 0.5, не изменяет выходной сигнал. Это то же самое на OSX и Linux. У кого-нибудь есть любая идея о том, что здесь происходит?

import moderngl
from pyrr import Matrix44
import numpy as np
import cv2

vertex_shader_source = """
    #version 330
    in vec3 local_vertex;
    uniform mat4 modelview_matrix;
    uniform mat4 projection_matrix;
    void main(){
        gl_Position = projection_matrix * modelview_matrix * vec4( local_vertex, 1.0 );
    }
"""

fragment_shader_source = """
    #version 330
    out vec4 out_color;
    void main() {
        out_color = vec4(1.0, 1.0, 1.0, 1.0);
    }
"""

context = moderngl.create_standalone_context()
prog = context.program(vertex_shader=vertex_shader_source, fragment_shader=fragment_shader_source)

vertices = np.array([[ 0.0,  0.0, 0.0],
                        [ 1.0,  0.0, 0.0],
                        [ 1.0,  1.0, 0.0]])

vbo = context.buffer(vertices.tobytes())
vao = context.simple_vertex_array(prog, vbo, "local_vertex")
color_renderbuffer = context.renderbuffer((128, 128))
fbo_regular = context.framebuffer(color_attachments=(color_renderbuffer))

modelview_matrix = Matrix44.look_at(np.array([0.0, 0.0, 10.0]), np.array([0.0, 0.0, 0.0]), np.array([0.0, 1.0, 0.0]))
projection_matrix = Matrix44.orthogonal_projection(-1.0, 1.0, -1.0, 1.0, 1.0, 100.0)
prog["projection_matrix"].write(projection_matrix.astype("f4").tobytes())
prog["modelview_matrix"].write(modelview_matrix.astype("f4").tobytes())

fbo_regular.use()
context.clear(1.0, 0.0, 0.0)
vao.render()

data = fbo_regular.read(components=3, alignment=1, dtype='f4')
data_array = np.frombuffer(data, dtype=np.float32).reshape(128,128,3)
cv2.imwrite("output0.png",(data_array[::-1]) * 255.0)

вывод: text

ОБНОВЛЕНИЕ: очевидно, когда я использую 'struct' модуль, проблема исчезает.

self.vbo = self.ctx.buffer(struct.pack('9f', 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0))

что дает ??

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Numpy использует 64-битные числа с плавающей точкой по умолчанию, поэтому in vec3 local_vertex в вашем вершинном шейдере немного запутан. См .: https://www.khronos.org/opengl/wiki/Data_Type_ (GLSL)

# The most efficient way is to construct the array using the right dtype
self.vertices = np.array([[ 0.0,  0.0, 0.0],
                          [ 1.0,  0.0, 0.0],
                          [ 1.0,  1.0, 0.0]], dtype='f4')

# Because both numpy and moderngl supports the buffer protocol
# we can pass them directly instead of converting to `bytes`
self.vbo = self.ctx.buffer(self.vertices)

Если у вас есть проблемы с moderngl, вы также можете обратиться к сообществу moderngl: https://github.com/moderngl/moderngl

0 голосов
/ 15 марта 2020

soved it, путем приведения буфера numpy к типу f4:

self.vertices = np.array([[ 0.0,  0.0, 0.0],
                          [ 1.0,  0.0, 0.0],
                          [ 1.0,  1.0, 0.0]])

self.vbo = self.ctx.buffer(self.vertices.astype('f4'))

дает ожидаемый результат. Тип данных по умолчанию для массива чисел с плавающей точкой numpy - f8 (64-битная двойная), вершинный буфер ожидает 32 бита. это просто так дает похожие результаты, которые меня отбросили.

...