Я попытался использовать поверхность шрифта pygame и преобразовать ее в пиксельные данные, используя data = pygame.image.tostring(img, "RGBA", 1), а затем использовал функцию gl для создания текстуры opengl и нарисуйте его с помощью glDrawArrays, используя также шейдеры. Однако в результате получается просто белый экран без текста.
Вот код, который я попробовал:
from __future__ import division
import pygame
import numpy as np
from OpenGL.GL import *
from OpenGL.GL import shaders
from pygame import *
pygame.init()
screen = pygame.display.set_mode((600, 400), DOUBLEBUF | OPENGL)
vertex_shader = shaders.compileShader("""
#version 130
in vec3 position;
out vec2 fragTexCoord;
uniform mat4 projectionMatrix;
uniform mat4 modelViewMatrix;
void main() {
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
fragTexCoord = gl_Position.xy;
}
""", GL_VERTEX_SHADER)
fragment_shader = shaders.compileShader("""
#version 130
in vec2 fragTexCoord;
uniform sampler2D textureSampler;
out vec4 fragmentColor;
void main() {
fragmentColor = texture(textureSampler, fragTexCoord);
}
""", GL_FRAGMENT_SHADER)
shader_program = shaders.compileProgram(vertex_shader, fragment_shader)
img = pygame.font.Font(None, 50).render("Hello", True, (255, 255, 255))
w, h = img.get_size()
texture = glGenTextures(1)
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glBindTexture(GL_TEXTURE_2D, texture)
glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
glTexParameter(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
data = pygame.image.tostring(img, "RGBA", 1)
glTexImage2D(GL_TEXTURE_2D, 0, 4, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, data)
quad_vertices = np.array([
[-1.0, -1.0, 0.0],
[ 1.0, -1.0, 0.0],
[ 1.0, 1.0, 0.0],
[-1.0, 1.0, 0.0],
], dtype=np.float32)
projection_matrix_loc = glGetUniformLocation(shader_program, "projectionMatrix")
modelview_matrix_loc = glGetUniformLocation(shader_program, "modelViewMatrix")
projection_matrix = np.array([[1.0, 0.0, 0.0, 0.0],
[0.0, 1.0, 0.0, 0.0],
[0.0, 0.0, -1.0, -1.0],
[0.0, 0.0, -1.0, 1.0]], dtype=np.float32)
modelview_matrix = np.identity(4, dtype=np.float32)
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
exit()
glClear(GL_COLOR_BUFFER_BIT)
glUseProgram(shader_program)
glUniformMatrix4fv(projection_matrix_loc, 1, GL_FALSE, projection_matrix)
glUniformMatrix4fv(modelview_matrix_loc, 1, GL_FALSE, modelview_matrix)
VBO = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, VBO)
glBufferData(GL_ARRAY_BUFFER, quad_vertices.size * quad_vertices.dtype.itemsize, quad_vertices, GL_STATIC_DRAW)
glEnableVertexAttribArray(0)
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, None)
glBindTexture(GL_TEXTURE_2D, texture)
glDrawArrays(GL_TRIANGLE_FAN, 0, 4)
glUseProgram(0)
pygame.display.flip()
pygame.time.Clock().tick(60)
Подробнее здесь: https://stackoverflow.com/questions/787 ... maybe-vert
Попытка заставить шейдеры PyOpenGL работать (появляется только белый экран); Может быть, вершина неправильная? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
.NET PAGE MAUI загружается как белый экран, ничего не появляется вообще [закрыто]
Anonymous » » в форуме C# - 0 Ответы
- 7 Просмотры
-
Последнее сообщение Anonymous
-