2022-04-07 18:46:57 +02:00

97 lines
2.8 KiB
Python

# OpenGL/Metal rendering test: render a green triangle on screen
import sys
sys.path.append('python')
import nanogui
from nanogui import Shader, Texture, RenderPass, Screen
import numpy as np
from PIL import Image
class MyScreen(Screen):
def __init__(self):
Screen.__init__(self, [512, 512], "Unnamed")
if nanogui.api == 'opengl':
vertex_program = '''
#version 330
in vec3 position;
void main() {
gl_Position = vec4(position, 1);
}
'''
fragment_program = '''
#version 330
uniform vec4 color;
out vec4 fragColor;
void main() {
fragColor = color;
}
'''
elif nanogui.api == 'metal':
vertex_program = '''
using namespace metal;
struct VertexOut {
float4 position [[position]];
};
vertex VertexOut vertex_main(const device packed_float3 *position,
uint id [[vertex_id]]) {
VertexOut vert;
vert.position = float4(position[id], 1.f);
return vert;
}
'''
fragment_program = '''
using namespace metal;
struct VertexOut {
float4 position [[position]];
};
fragment float4 fragment_main(VertexOut vert [[stage_in]],
const constant float4 &color) {
return color;
}
'''
self.render_pass = RenderPass([self])
self.render_pass.set_viewport(
[10, 10], self.framebuffer_size() - [10, 20]
)
self.shader = Shader(
self.render_pass,
"test_shader",
vertex_program,
fragment_program
)
p = np.array([[ 0.0, 0.5, 0],
[-0.5, -0.5, 0],
[ 0.5, -0.5, 0]], dtype=np.float32)
self.shader.set_buffer("position", p)
self.shader.set_buffer("color", np.array([0, 1, 0, 1], dtype=np.float32))
self.shader.set_buffer("indices", np.array([0, 1, 2], dtype=np.uint32))
def draw_contents(self):
print('draw_contents()')
with self.render_pass:
with self.shader:
if False:
self.shader.draw_array(Shader.PrimitiveType.Triangle, 0, 3)
else:
self.shader.draw_array(Shader.PrimitiveType.Triangle, 0, 3, indexed=True)
nanogui.init()
s = MyScreen()
s.set_visible(True)
nanogui.mainloop()
nanogui.shutdown()