如何构建一个自编译文件,将立方体的顶点像素着色为黄色?

问题描述 投票:0回答:1

如何构建一个自编译文件,将立方体的顶点像素着色为黄色?

你能帮我解决这个 Python 编译错误并提出有效的代码示例吗?

import pygame
import OpenGL
import OpenGL.GL as g1
import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GL.shaders import compileProgram, compileShader
from OpenGL.GL import shaders

if bool(glCreateShader):
    shader = glCreateShader(GL_VERTEX_SHADER)
    # Continue with shader operations
else:
    print("glCreateShader is not available on this system.")

vertex_shader = """
#version 330 core
layout(location = 0) in vec3 in_position;
void main()
{
    gl_Position = vec4(in_position, 1.0);
}
"""

fragment_shader = """
#version 330 core
out vec4 frag_color;
void main()
{
    frag_color = vec4(1.0, 0.0, 0.0, 1.0);  // Red color
}
"""

vertices= (
    (1, -1, -1),
    (1, 1, -1),
    (-1, 1, -1),
    (-1, -1, -1),
    (1, -1, 1),
    (1, 1, 1),
    (-1, -1, 1),
    (-1, 1, 1)
    )

edges = (
    (0,1),
    (0,3),
    (0,4),
    (2,1),
    (2,3),
    (2,7),
    (6,3),
    (6,4),
    (6,7),
    (5,1),
    (5,4),
    (5,7)
    )

def Cube():
    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(vertices[vertex])
    glEnd()

shader = shaders.compileShader(vertex_shader  , g1.GL_VERTEX_SHADER)

# Define vertex and fragment shaders here
vertex_shader_source = """
#version 330 core
layout(location = 0) in vec2 in_position;
void main() {
    gl_Position = vec4(in_position, 0.0, 1.0);
}
"""

fragment_shader_source = """
#version 330 core
uniform vec3 pixelColor;
out vec4 fragColor;
void main() {
    fragColor = vec4(pixelColor, 1.0);
}
"""

if __name__ == "__main__":
    vertex_shader = compileShader(vertex_shader_source, GL_VERTEX_SHADER)
    fragment_shader = compileShader(fragment_shader_source, GL_FRAGMENT_SHADER)
    shader_program = compileProgram(vertex_shader, fragment_shader)
    glUniform3f(glGetUniformLocation(shader_program, "pixelColor"), 1.0, 0.0, 0.0)
    pygame.init()
    display = (800,600)
    pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
    
    gluPerspective(45, (display[0]/display[1]), 0.1, 50.0)

    glTranslatef(0.0,0.0, -5)

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        glRotatef(1, 3, 1, 1)
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
        Cube()
        pygame.display.flip()
        pygame.time.wait(10)

尝试调用未定义的备用函数(glCreateShader、glCreateShaderObjectARB),在调用之前检查 bool(glCreateShader)

python opengl pygame pyopengl
1个回答
1
投票

在创建 OpenGL 上下文 之前,您无法调用 OpenGL 函数。当使用

pygame.display.set_mode
pyame.OPENGL
标志创建 OpenGL 窗口时,Pygame 会创建 OpenGL 上下文。因此,在调用
pygame.display.set_mode
之前调用 OpenGL API 函数会导致错误。

如果您想使用旧版 OpenGL,您只需使用

glColor
设置颜色即可。例如:

glColor4f(1, 1, 0, 1)
Cube()

基于您的代码的完整示例:

import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *

vertices= (
    (1, -1, -1), (1, 1, -1), (-1, 1, -1), (-1, -1, -1),
    (1, -1, 1), (1, 1, 1), (-1, -1, 1), (-1, 1, 1))
edges = ((0,1), (0,3), (0,4), (2,1), (2,3), (2,7), (6,3), (6,4), (6,7), (5,1), (5,4), (5,7))

def Cube():
    glBegin(GL_LINES)
    for edge in edges:
        for vertex in edge:
            glVertex3fv(vertices[vertex])
    glEnd()

if __name__ == "__main__":
    pygame.init()
    display = (800,600)
    pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
    
    gluPerspective(45, (display[0]/display[1]), 0.1, 50.0)
    glTranslatef(0.0,0.0, -5)

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()

        glRotatef(1, 3, 1, 1)
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
        glColor4f(1, 1, 0, 1)
        Cube()
        pygame.display.flip()
        pygame.time.wait(10)
© www.soinside.com 2019 - 2024. All rights reserved.