Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OpenGL无法靠混合GL_BLEND设置整体透明度GL.glColor4f #46

Closed
HeavyNotFat opened this issue Jan 26, 2025 · 9 comments
Closed

OpenGL无法靠混合GL_BLEND设置整体透明度GL.glColor4f #46

HeavyNotFat opened this issue Jan 26, 2025 · 9 comments
Labels
documentation Improvements or additions to documentation

Comments

@HeavyNotFat
Copy link

环境

项目 数据
运行环境 Python 3.12 (Intel x64)
图形处理 NVIDIA GeForce RTX 2060 | NVIDIA GeForce RTX 3060
电脑内存 32GB
中央处理 I9-12400K

问题描述

  • OpenGL无法靠混合GL_BLEND设置透明度
已排除问题 思路
OpenGL问题 单独测试GL.glColor4f是可以的
Python问题 在切换了Python 3.10 (intel x64) 和 Python 3.11 (Intel x64) 后问题仍然存在
电脑问题 在换了6台不同配置的电脑仍然存在

代码

以下是mian.pyOpenGL初始化内容

class DesktopPet(QOpenGLWidget):
    def __init__(self):
        ...

    # OpenGL 事件 OpenGL events
    def initializeGL(self):
        GL.glEnable(GL.GL_DEPTH_TEST)
        GL.glEnable(GL.GL_BLEND)
        GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA)

        live2d.glewInit()
        self.pet_model = live2d.LAppModel()
        self.pet_model.LoadModelJson("./resources/model/vanilla/Vanilla.model3.json")
        for i in range(self.pet_model.GetParameterCount()):
            param = self.pet_model.GetParameter(i)
            self.param_dict.update({param.id: {"value": param.value, "max": param.max, "min": param.min}})
        AutoBlinkEye(self, self.param_dict).start()
        self.startTimer(int(1000 / 900))

    def resizeGL(self, width, height):
        self.pet_model.Resize(width, height)

# 感谢各位大佬的解答~

    def paintGL(self):
        GL.glColor4f(1, 1, 1, 0.2)
        live2d.clearBuffer()
        # 加载模型 Load Model
        self.pet_model.Draw()

我已设置GL.glColor4f(1, 1, 1, 0.2)

20行 位于paintGL(self)

也设置了GL.glEnable(GL.GL_BLEND) GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA)

4、5行 位于initializeGL(self)

以下为问题图

  • GL.glColor4f

Image

  • GL.glColor4f

Image

@Arkueid
Copy link
Owner

Arkueid commented Jan 26, 2025

是指这样的透明度吗:
左(不透明),右(半透明)
Image

@HeavyNotFat
Copy link
Author

是指这样的透明度吗: 左(不透明),右(半透明) Image

是的,请问是怎么实现的,谢谢!

@HeavyNotFat
Copy link
Author

是指这样的透明度吗: 左(不透明),右(半透明) Image

是的,请问是怎么实现的,谢谢!

@Arkueid
Copy link
Owner

Arkueid commented Jan 27, 2025

可以对 QOpenGLWidget 窗体设置透明度:

class Win(QOpenGLWidget):

    def __init__(self) -> None:
        super().__init__()
        ...
        self.setWindowOpacity(0.4)  # 设置qt窗体的透明度

效果类似:

Image

@HeavyNotFat
Copy link
Author

可以对 QOpenGLWidget 窗体设置透明度:

class Win(QOpenGLWidget):

def __init__(self) -> None:
    super().__init__()
    ...
    self.setWindowOpacity(0.4)  # 设置qt窗体的透明度

效果类似:

Image

此方法无效,已试过

@Arkueid
Copy link
Owner

Arkueid commented Jan 29, 2025

GL.glColor4f 仅适用于固定功能流水线绘制,而 Live2D 内部使用着色器渲染,因此不起作用。

setWindowOpacity 无效,我觉得有可能是窗口类 DesktopTop 设置了父 Widget。如果是,那么可以考虑使用 QGraphicsOpacityEffect 设置窗口透明度。

如果 QGraphicsOpacityEffect 同样无效,那么会在后续版本增加一个设置整个模型透明度的方法。

@HeavyNotFat
Copy link
Author

GL.glColor4f 仅适用于固定功能流水线绘制,而 Live2D 内部使用着色器渲染,因此不起作用。

setWindowOpacity 无效,我觉得有可能是窗口类 DesktopTop 设置了父 Widget。如果是,那么可以考虑使用 QGraphicsOpacityEffect 设置窗口透明度。

如果 QGraphicsOpacityEffect 同样无效,那么会在后续版本增加一个设置整个模型透明度的方法。

常规的方法比如QGraphicsOpacityEffect setWindowOpacity GL.glColor4f均无效,setWindowOpacity有作用,但没办法进行动态调整

@Arkueid Arkueid added the enhancement New feature or request label Feb 2, 2025
@Arkueid Arkueid added this to the v0.3.7 milestone Feb 2, 2025
@Arkueid Arkueid removed this from the v0.3.7 milestone Feb 14, 2025
@Arkueid
Copy link
Owner

Arkueid commented Feb 14, 2025

效果:

Image

代码:

实现了一个 OpenGLCanvas QT 窗口类,可以设置整体透明度

package/main_pyqt5_canvas_opacity.py

原理:

将整个 live2d 作为纹理绘制到一个离屏的帧缓存中,对这个纹理进行透明度处理之后再绘制到屏幕上,完全使用 pyopengl 和 qt 实现。

@Arkueid Arkueid added documentation Improvements or additions to documentation and removed enhancement New feature or request labels Feb 14, 2025
@HeavyNotFat
Copy link
Author

HeavyNotFat commented Feb 18, 2025

效果:

Image Image

代码:

实现了一个 OpenGLCanvas QT 窗口类,可以设置整体透明度

package/main_pyqt5_canvas_opacity.py

原理:

将整个 live2d 作为纹理绘制到一个离屏的帧缓存中,对这个纹理进行透明度处理之后再绘制到屏幕上,完全使用 pyopengl 和 qt 实现。

感谢

@Arkueid Arkueid closed this as completed Mar 13, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation
Projects
None yet
Development

When branches are created from issues, their pull requests are automatically linked.

2 participants