Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于QT中的QSGGeometryNode和WebAssembly_Qt_C++11_Webassembly - Fatal编程技术网

关于QT中的QSGGeometryNode和WebAssembly

关于QT中的QSGGeometryNode和WebAssembly,qt,c++11,webassembly,Qt,C++11,Webassembly,我试图使用WebAssembly在Web上部署我的项目,但遇到了一些问题 该项目使用QSGRenderNode进行了自定义渲染,并在web上运行 我得到错误“无效操作缓冲区大小不足” 这是我的密码 openglerenderer.h \ifndef openglu\H #定义OpenGLU渲染器 #包括 #包括 #包括“webaccess/render/baserender.h” #如果QT_配置(opengl) 类OpenGLRenderNode:publicqsgrenderNode { 公

我试图使用WebAssembly在Web上部署我的项目,但遇到了一些问题

该项目使用QSGRenderNode进行了自定义渲染,并在web上运行

我得到错误“无效操作缓冲区大小不足”

这是我的密码

openglerenderer.h

\ifndef openglu\H
#定义OpenGLU渲染器
#包括
#包括
#包括“webaccess/render/baserender.h”
#如果QT_配置(opengl)
类OpenGLRenderNode:publicqsgrenderNode
{
公众:
~OpenGLRenderNode();
无效渲染(常量渲染状态*状态)覆盖;
void releaseResources()覆盖;
StateFlags changedStates()常量覆盖;
RenderingFlags()常量覆盖;
QRectF rect()常量覆盖;
无效同步(QQuickItem*项目);
私人:
void init();
int m_width=0;
int m_高度=0;
布尔-贝尼特=假;
BaseRender*m_render=nullptr;
};
#恩迪夫
#endif//openglu\H
openglerenderer.cpp

#包括“openglrenderer.h”
#包括
#如果QT_配置(opengl)
#包括
#包括
#包括
#包括“webaccess/render/tutorial/les1.h”
#包括“webaccess/render/tutorial/les2.h”
#包括“webaccess/render/tutorial/les3.h”
#包括“webaccess/render/tutorial/les4.h”
OpenGLRenderNode::~OpenGLRenderNode()
{
释放资源();
}
void OpenGLRenderNode::releaseResources()
{
如果(m_渲染){
m_render->releaseResources();
}
}
void OpenGLRenderNode::init()
{
如果(m_渲染){
m_render->init();
贝尼特=真;
}
}
void OpenGLRenderNode::render(常量RenderState*状态)
{
如果(!beInit)
init();
如果(m_渲染){
m_render->render(状态);
}
}
QSGRenderNode::StateFlags OpenGLRenderNode::changedStates()常量
{
返回BlendState |剪刀状态|模具状态;
}
QSGRenderNode::RenderingFlags OpenGLRenderNode::flags()常量
{
返回BoundedRectRendering | depshawareRendering;
}
QRectF OpenGLRenderNode::rect()常量
{
返回QRect(0,0,m_宽度,m_高度);
}
void OpenGLRenderNode::sync(QQuickItem*项)
{
m_宽度=静态_铸造(项目->宽度());
m_高度=静态施法(项目->高度());
如果(!m_render){
m_render=static_cast(新的les4{});
如果(m_渲染){
QObject::connect(项->窗口(),&QQuickWindow::beforeRendering,m_render,[&](){m_render->beforeRender();},Qt::DirectConnection);
}
}
如果(m_渲染){
m_渲染->同步(项目);
m_render->setViewportSize(项目->大小().toSize()*项目->窗口()->devicePixelRatio());
m_render->setPosition(项目->位置().toPoint());
渲染->设置窗口(项目->窗口());
}
}
#恩迪夫
les4.h

\ifndef LES4\u H
#定义LES4_H
#包括“./baserender.h”
类QOpenGLTexture;
QOpenGLShaderProgram类;
QOpenGLBuffer类;
类Qopengelvertexarrayobject;
les4类:公共BaseRender
{
公众:
les4();
~les4()覆盖;
虚拟void init()覆盖;
虚拟void渲染(const QSGRenderNode::RenderState*state)覆盖;
虚拟无效同步(QQuickItem*item)覆盖;
虚拟void releaseResources()覆盖;
虚拟void setViewportSize(QSize size)重写{m_viewportSize=size;}
虚空设置位置(QPoint point)覆盖{m_position=point;}
虚拟void setWindow(QQuickWindow*窗口)重写{m_window=window;}
虚拟void beforeRender()覆盖;
私人:
QSize m_viewportSize{};
点m_位置{};
QQuickWindow*m_window{};
QOpenGLShaderProgram*m_program=nullptr;
Qopengelvertexarrayobject*m_vao=nullptr;
QOpenGLBuffer*m_vbo=nullptr;
QOpenGLBuffer*m_ibo=nullptr;
int m_width=0;
int m_高度=0;
};
#endif//LES4_H
les4.cpp

#包括“les4.h”
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
静态常量字符*vertexShaderSource=
“#版本100\n”
“属性vec3 aPos;\n”
“属性vec3 aColor;\n”
“不同的颜色;\n”
“void main(){\n”
“gl_Position=vec4(aPos.xyz,1.0);\n”
“ourColor=aColor;\n”
"}";
静态常量字符*fragmentShaderSource=
“#版本100\n”
#如果定义(Q_OS_HTML5)或定义(Q_OS_WASM)或定义(u EMSCRIPTEN_u)
“精度中间泵浮动;\n”
#恩迪夫
“不同的颜色;\n”
“void main(){\n”
“gl_FragColor=vec4(ourColor,1.0);\n”
"}";
静态浮动顶点[]{
// 位置              // 顏色
0.5f,-0.5f,0.0f,1.0f,0.0f,0.0f,//右下
-0.5f,-0.5f,0.0f,0.0f,1.0f,0.0f,//左下
0.0f、0.5f、0.0f、0.0f、0.0f、1.0f//頂部
};
静态无符号整数索引[]{
0, 1, 2
};
les4::les4()
{
}
les4::~les4()
{
}
void les4::init(){
QSurfaceFormat-fmt;
fmt.setVersion(2,0);
setRenderableType(QSurfaceFormat::OpenGLES);
fmt.setMajorVersion(2);
fmt.setMinorVersion(0);
fmt.setRedBufferSize(5);
fmt.设置绿色缓冲区大小(6);
模板尺寸(5);
fmt.setAlphaBufferSize(0);
fmt.setDepthBufferSize(0);
QSurfaceFormat::setDefaultFormat(fmt);
QOpenGLContext*ctx=QOpenGLContext::currentContext();
ctx->setFormat(fmt);
}
void les4::releaseResources(){
删除m_程序;
m_程序=空PTR;
删除m_vbo;
m_vbo=空PTR;
删除m_ibo;
m_ibo=nullptr;
删除m_vao;
m_vao=空PTR;
}
void les4::beforeRender(){
}
void les4::render(常量QSGRenderNode::RenderState*){
QOpenGLContext*ctx=QOpenGLContext::currentContext();
#如果定义(Q_OS_HTML5)或定义(Q_OS_WASM)或定义(u EMSCRIPTEN_u)
const bool isCoreProfile=false;
#否则
const bool isCoreProfile=ctx->format().profile()==QSurfaceFormat::CoreProfile;
#恩迪夫
QOpenGLFunctions*f=ctx->functions();
int y=(m_窗口->大小()*m_窗口->设备像素比率()).height()-m_