繁体   English   中英

如何将屏幕分辨率传递给 pyOpengl 中的着色器

[英]How can I pass the screen resolution to my shader in pyOpengl

开始学习如何使用着色器。 但是我解决不了一个问题。 请帮忙。 我需要告诉着色器我屏幕的分辨率。 也许我使用了错误的参数?

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


def create_shader(shader_type, source):
    shader = glCreateShader(shader_type)
    glShaderSource(shader, source)
    glCompileShader(shader)
    return shader


pygame.init()
display = (1000, 800)
screen = pygame.display.set_mode(display, DOUBLEBUF | OPENGL)

fragment = create_shader(GL_FRAGMENT_SHADER, """
    #version 330
    uniform vec2 iResolution;
    void main()
    {
        gl_FragColor = vec4(gl_FragCoord.x / iResolution.x, 0.0, 1.0, 1.0); 
    }
""")

program = glCreateProgram()
glAttachShader(program, fragment)
glLinkProgram(program)
glUseProgram(program)

k = glGetAttribLocation(program, 'iResolution')
print(k)
glVertexAttrib2d(0, display[0], display[1])

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
    glClearColor(0.0, 0.0, 0.0, 0.0)
    glClear(GL_COLOR_BUFFER_BIT)
    glPointSize(1000)
    glBegin(GL_POINTS)
    glVertex2f(0.0, 0.0)
    glVertex2f(0.5, 0.0)
    glEnd()
    pygame.display.flip()

当前代码片段不起作用。 k 总是等于 -1...

iResolution不是一个属性,而是一个制服。 使用glUniform2f获取位置并使用glGetUniformLocation设置值:

glUseProgram(program)
k = glGetUniformLocation(program, 'iResolution')
glUniform2f(k, display[0], display[1])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM