我最近开始学习 OpenGL,我一直在处理纹理。我使用更新了我的纹理,glTexImage2D但我了解到使用它更好glTexSubImage2D,所以我尝试更改我的代码但我不起作用。
工作代码
void GLWidget::updateTextures(){
QImage t = img.mirrored();
glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits());
glBindTexture( GL_TEXTURE_2D, 0);
}
Run Code Online (Sandbox Code Playgroud)
不工作的代码
void GLWidget::updateTextures(){
QImage t = img.mirrored();
glBindTexture(GL_TEXTURE_2D, tex);
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, t.width(), t.height(), GL_RGBA, GL_UNSIGNED_BYTE, t.bits());
glBindTexture( GL_TEXTURE_2D, 0);
}
Run Code Online (Sandbox Code Playgroud)
我只有黑屏。
谢谢。
编辑 :
这是我的纹理的初始化:
void GLWidget::initializeGL(){
...
LoadGLTextures();
...
}
void GLWidget::LoadGLTextures(){
QImage t = img.mirrored();
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexImage2D(GL_TEXTURE_2D, 0, 3, t.width(), t.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, t.bits()); …Run Code Online (Sandbox Code Playgroud) 我正在努力提高项目的性能,所以我想弄清楚哪个操作需要时间.
我注意到我的emit功能需要30ms,是否可以发送数据?
这是代码:
void MainWindow::play(){
unsigned char* img; //Size is 1280*720*2
img = camera1->captureLastFrame();
timer.start();
emit video(img);
qDebug()<<QString::number(timer.nsecsElapsed()/1000000) + " ms";
}
Run Code Online (Sandbox Code Playgroud)
该qDebug显示器30毫秒.我做错了什么,或者这个操作真的需要时间吗?
编辑:
信号和插槽声明/连接.
signals:
void video(unsigned char* copy);
private slots:
void play();
connect(this, SIGNAL(video(unsigned char*)), ui->widget, SLOT(videodisplay(unsigned char*)));
Run Code Online (Sandbox Code Playgroud) 出于测试目的,我在Qt中尝试不同大小的数组.
这是代码:
#include <QCoreApplication>
#include <iostream>
using namespace std;
int const sizeArray = 519199;
int main()
{
string arr[sizeArray];
for(int i = 0; i < sizeArray; i++)
{
arr[i] = i;
}
arr[499999] = "Test";
cout << arr[499999] << endl;
}
Run Code Online (Sandbox Code Playgroud)
当sizeArray为519999时,程序快速运行并显示"Test".但是当sizeArray519200或更多时,程序运行时间较长(约5秒),然后完成而不显示"测试".
这是OS或Qt的内存限制吗?