我试图弄清楚如何使用PyQt在QML中创建表面图。但是,无论何时创建Surface3D项,都会在控制台上打印很多着色器程序错误。我尝试了许多其他方法来摆脱它们,包括禁用阴影并尝试创建QOpenGLShaderProgram进行链接,但没有任何方法可以消除错误。
这是我遇到的错误:
QOpenGLShader::link: Varying "coords_mdl" has different type width across different shaders.
QOpenGLShaderProgram::attributeLocation(vertexPosition_mdl): shader program is not linked
QOpenGLShaderProgram::attributeLocation(vertexNormal_mdl): shader program is not linked
QOpenGLShaderProgram::attributeLocation(vertexUV): shader program is not linked
QOpenGLShaderProgram::uniformLocation(MVP): shader program is not linked
QOpenGLShaderProgram::uniformLocation(V): shader program is not linked
QOpenGLShaderProgram::uniformLocation(M): shader program is not linked
QOpenGLShaderProgram::uniformLocation(itM): shader program is not linked
QOpenGLShaderProgram::uniformLocation(depthMVP): shader program is not linked
QOpenGLShaderProgram::uniformLocation(lightPosition_wrld): shader program is not linked
QOpenGLShaderProgram::uniformLocation(lightStrength): shader program is not linked
QOpenGLShaderProgram::uniformLocation(ambientStrength): shader program is not linked
QOpenGLShaderProgram::uniformLocation(shadowQuality): shader program is not linked
QOpenGLShaderProgram::uniformLocation(color_mdl): shader program is not linked
QOpenGLShaderProgram::uniformLocation(textureSampler): shader program is not linked
QOpenGLShaderProgram::uniformLocation(shadowMap): shader program is not linked
QOpenGLShaderProgram::uniformLocation(gradMin): shader program is not linked
QOpenGLShaderProgram::uniformLocation(gradHeight): shader program is not linked
QOpenGLShaderProgram::uniformLocation(lightColor): shader program is not linked
QOpenGLShaderProgram::uniformLocation(volumeSliceIndices): shader program is not linked
QOpenGLShaderProgram::uniformLocation(colorIndex): shader program is not linked
QOpenGLShaderProgram::uniformLocation(cameraPositionRelativeToModel): shader program is not linked
QOpenGLShaderProgram::uniformLocation(color8Bit): shader program is not linked
QOpenGLShaderProgram::uniformLocation(textureDimensions): shader program is not linked
QOpenGLShaderProgram::uniformLocation(sampleCount): shader program is not linked
QOpenGLShaderProgram::uniformLocation(alphaMultiplier): shader program is not linked
QOpenGLShaderProgram::uniformLocation(preserveOpacity): shader program is not linked
QOpenGLShaderProgram::uniformLocation(minBounds): shader program is not linked
QOpenGLShaderProgram::uniformLocation(maxBounds): shader program is not linked
QOpenGLShaderProgram::uniformLocation(sliceFrameWidth): shader program is not linked
以下是产生错误的示例代码:
example.py
import sys
from PyQt5.QtQml import QQmlApplicationEngine
from PyQt5.QtWidgets import QApplication
app = QApplication(sys.argv)
engine = QQmlApplicationEngine()
engine.load("SurfaceGraphExample.qml")
engine.quit.connect(app.quit)
sys.exit(app.exec_())
SurfaceGraphExample.qml
import QtQuick 2.9
import QtQuick.Controls 2.2
import QtDataVisualization 1.3
ApplicationWindow {
width: 300
height: 300
visible: true
Surface3D {
anchors.fill: parent
shadowQuality: AbstractGraph3D.ShadowQualityNone
}
}
通过遵循Qt文档中的此示例,我可以按预期显示所有数据,但是在控制台中仍然出现着色器程序错误:https://doc.qt.io/qt-5.11/qtdatavisualization-qmlsurface-example.html
我试图手动创建一个着色器程序并将其链接到Python(如以下代码所示),但是一切都失败了。所有“ *失败”的打印语句都将执行,但是没有要打印的日志(这些语句仅打印换行符)。
from PyQt5.QtGui import QOpenGLShader, QOpenGLShaderProgram
shader_program = QOpenGLShaderProgram()
if not shader_program.addShaderFromSourceCode(QOpenGLShader.Vertex,
"attribute highp vec4 vertex;\n"
"uniform highp mat4 matrix;\n"
"void main(void)\n"
"{\n"
" gl_Position = matrix * vertex;\n"
"}"):
print("adding vertex shader failed")
print(shader_program.log())
if not shader_program.addShaderFromSourceFile(QOpenGLShader.Vertex, "shader.vert"):
print("adding vertex shader from file failed")
print(shader_program.log())
if not shader_program.addShaderFromSourceCode(QOpenGLShader.Fragment,
"void main(void)\n"
"{\n"
" gl_FragColor = vec4(1.0,0.0,0.0,1.0);\n"
"}"):
print("adding fragment shader failed")
print(shader_program.log())
shader_program.setAttributeValue("vertexUV", 1.0)
if shader_program.link():
print("link succeeded")
else:
print("link failed")
print(shader_program.log())
if not shader_program.bind():
print("bind failed")
else:
print("bind succeeded")
我正在使用Windows 10 64位和Intel HD Graphics 620(已更新为最新的驱动程序)。 我已经安装了Python 3.6.1,PyQt 5.10.0和PyQtDataVisualization 5.10.0。