Почему QOpenGLWidget не использует QSurfaceFormat по умолчанию в initializeGL?
Я пытаюсь отобразить изображение в RGB30
формат.
- система:
Windows 10 x64
Qt
версия:5.12.1 msvc2017_64
- Видеокарта:
Quadro P400
- Монитор:
NEC MD211C2
(Проверено тестом отNEC
, 10-битный режим это работа)
При создании Qt
В приложении я указываю формат поверхности:
main.cpp
#include "mainwindow.h"
#include <QApplication>
#include <QSurfaceFormat>
int main(int argc, char *argv[])
{
QSurfaceFormat format;
format.setDepthBufferSize(32);
format.setRedBufferSize (10);
format.setGreenBufferSize (10);
format.setBlueBufferSize (10);
format.setAlphaBufferSize(0);
format.setRenderableType(QSurfaceFormat::OpenGL);
format.setVersion(4, 6);
QSurfaceFormat::setDefaultFormat(format);
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
Затем я вручную создаю виджет, унаследованный от QOpenGLWidget
и поместите его в макет, передав в конструктор виджета сгенерированный QByteArray
, который является данными изображения в формате RGB30 (10-10-10-x)
,
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QBuffer>
#include <QtEndian>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
width = 2048;
height = 600;
QByteArray *arr = gen30bitImgArr(width, height);
ogl10 = new MyOGL(this, arr);
ui->vLout->addWidget(ogl10);
}
MainWindow::~MainWindow()
{
delete ui;
}
QByteArray *MainWindow::gen30bitImgArr(int width, int height)
{
QByteArray *arr = new QByteArray();
QBuffer buffer(arr);
buffer.open (QIODevice::WriteOnly);
QDataStream out(&buffer);
uint32_t rgb30color = 0;
for (int row = 0; row < height; ++row) {
for (uint32_t pixel = 0; static_cast<int>(pixel)< 1024; ++pixel) {
for (int chanel = 0; chanel < 3; ++chanel) {
rgb30color |= pixel;
chanel == 2? 0 : rgb30color <<= 10;
}
rgb30color = qToBigEndian(rgb30color);
out << rgb30color;
out << rgb30color;
rgb30color = 0;
}
}
return arr;
}
в MyOGL
виджет (на примере qopenglwidget
), Я создаю прямоугольник и пытаюсь отобразить QOpenGLTexture
в нем в формате GL_RGB10_A2
, Здесь начинаются проблемы: если я настраиваю текстуру на 8-битный массив (я исключил ее из примера), все отображается правильно (не факт, мне показалось, что черный и белый цвета не максимизируются при края прямоугольника), но стоит все перевести в 10-битный режим отображения, так как здесь вместо прямоугольника отображается черный цвет. Я долго страдал, просматривая все возможные комбинации параметров, подходящих для моей задачи, и затем я решил посмотреть, что у меня есть в this-> format();
, Оказывается, в MyOGL
конструктор, QSurfaceFormat - это формат, который я указал по умолчанию, с 10 битами на канал, но уже в initializeGL()
, он меняется на какой-то неизвестный, с 8 битами на канал... Я не понимаю, в какой момент происходит замена. В документации, как бы я ни копался, объяснений не нашел. я цитирую MyOGL
:
myogl.h
#ifndef MYOGL_H
#define MYOGL_H
#include <QObject>
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLShaderProgram>
#include <QOpenGLShader>
#include <QOpenGLTexture>
#include <QOpenGLBuffer>
class MyOGL : public QOpenGLWidget, protected QOpenGLFunctions
{
Q_OBJECT
public:
MyOGL(QWidget *parent = nullptr, const QByteArray *imgArr = nullptr);
~MyOGL() override;
protected:
void initializeGL() override;
void paintGL() override;
void resizeGL(int w, int h) override;
private:
void makeObject();
const QByteArray *imgData;
qreal m_fAngle;
qreal m_fScale;
QVector<QVector3D> m_vertices;
QOpenGLShader *m_vshader;
QOpenGLShader *m_fshader;
QOpenGLShaderProgram *m_program;
QOpenGLTexture *m_texture;
QOpenGLBuffer m_vbo;
int m_vertexAttr;
int m_texCoordAttr;
int m_textureUniform;
QColor m_background = QColor(30, 30, 30);
};
#endif // MYOGL_H
myogl.cpp
#include "myogl.h"
#include "qdebug.h"
MyOGL::MyOGL(QWidget *parent, const QByteArray *imgArr)
: QOpenGLWidget(parent),
m_program(nullptr),
m_texture(nullptr)
{
qDebug()<<"------------Start constructor-----------";
this->setTextureFormat (GL_RGB10_A2);
imgData = imgArr;
qDebug()<<this->format()<<"\n";
qDebug()<<this->format().renderableType()<<"\n";
qDebug()<<this->textureFormat()<<"\n";
qDebug()<<QSurfaceFormat::defaultFormat()<<"\n";
qDebug()<<"------------END constructor-----------\n";
}
MyOGL::~MyOGL()
{
makeCurrent();
delete m_texture;
delete m_program;
delete m_vshader;
delete m_fshader;
m_vbo.destroy();
doneCurrent();
}
void MyOGL::initializeGL()
{
qDebug()<<"----------Start Initalization-----------";
qDebug()<<this->format()<<"\n";
qDebug()<<this->format().renderableType()<<"\n";
qDebug()<<this->textureFormat()<<"\n";
qDebug()<<QSurfaceFormat::defaultFormat()<<"\n";
initializeOpenGLFunctions();
m_texture = new QOpenGLTexture(QOpenGLTexture::Target2D);
m_texture->setFormat(QOpenGLTexture::RGB10A2);
m_texture->setSize(2048, 600);
m_texture->setMipLevels(1);
m_texture->allocateStorage(QOpenGLTexture::RGBA,
QOpenGLTexture::UInt32_RGB10A2);
m_texture->setData(0,
QOpenGLTexture::RGBA,
QOpenGLTexture::UInt32_RGB10A2,
imgData->constData());
m_vshader = new QOpenGLShader(QOpenGLShader::Vertex);
const char *vsrc2 =
"attribute highp vec4 vertex;\n"
"attribute mediump vec4 texCoord;\n"
"varying mediump vec4 texc;\n"
"void main(void)\n"
"{\n"
" gl_Position = vertex;\n"
" texc = texCoord;\n"
"}\n";
m_vshader->compileSourceCode(vsrc2);
m_fshader = new QOpenGLShader(QOpenGLShader::Fragment);
const char *fsrc2 =
"uniform sampler2D tex;\n"
"varying mediump vec4 texc;\n"
"void main(void)\n"
"{\n"
" gl_FragColor = texture2D(tex, texc.st);\n"
"}\n";
m_fshader->compileSourceCode(fsrc2);
m_program = new QOpenGLShaderProgram;
m_program->addShader(m_vshader);
m_program->addShader(m_fshader);
m_program->link();
m_vertexAttr = m_program->attributeLocation("vertex");
m_texCoordAttr = m_program->attributeLocation("texCoord");
m_textureUniform = m_program->uniformLocation("tex");
m_fAngle = 0;
m_fScale = 1;
const int vertexCount = m_vertices.count();
QVector<GLfloat> buf;
buf.resize(vertexCount * 3 * 2);
GLfloat *p = buf.data();
for (int i = 0; i < vertexCount; ++i) {
*p++ = m_vertices[i].x();
*p++ = m_vertices[i].y();
*p++ = m_vertices[i].z();
}
}
void MyOGL::paintGL()
{
glClearColor(m_background.redF(),
m_background.greenF(),
m_background.blueF(),
1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glFrontFace(GL_CW);
//glCullFace(GL_FRONT);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
m_program->bind();
makeObject();
m_program->release();
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
update();
}
void MyOGL::resizeGL(int w, int h)
{
}
void MyOGL::makeObject()
{
m_texture->bind();
if (!m_vbo.isCreated()) {
static GLfloat afVertices[] = {
-0.5f, -0.5f, 0.0f,
-0.5f, 0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.5f, 0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
-0.5f, 0.5f, 0.0f
};
static GLfloat afTexCoord[] = {
0.25f, 0.25f,
0.25f, 0.75f,
0.75f, 0.25f,
0.75f, 0.75f,
0.75f, 0.25f,
0.25f, 0.75f
};
m_vbo.create();
m_vbo.bind();
m_vbo.allocate(30 * sizeof(GLfloat));
m_vbo.write(0, afVertices, sizeof(afVertices));
m_vbo.write(sizeof(afVertices), afTexCoord, sizeof(afTexCoord));
m_vbo.release();
}
m_program->setUniformValue(m_textureUniform, 0); // use texture unit 0
m_program->enableAttributeArray(m_vertexAttr);
m_program->enableAttributeArray(m_texCoordAttr);
m_vbo.bind();
m_program->setAttributeBuffer(m_vertexAttr, GL_FLOAT, 0, 3);
m_program->setAttributeBuffer(m_texCoordAttr, GL_FLOAT,
6 * 3 * sizeof(GLfloat), 2);
m_vbo.release();
glDrawArrays(GL_TRIANGLES, 0, 6);
m_program->disableAttributeArray(m_vertexAttr);
m_program->disableAttributeArray(m_texCoordAttr);
}
Я также присоединяю вывод к консоли и результат вызова qtdiag.exe
Я хочу обратить ваше внимание наBuffer Size (RGBA) 8,8,8,8
, Почему такая информация отображается? Моя видеокарта поддерживает 10,10,10,2, и монитор переключен на 10-bit
Режим!
QDebug
------------Start constructor-----------
QSurfaceFormat(version 4.6, options QFlags<QSurfaceFormat::FormatOption>(), depthBufferSize 32, redBufferSize 10, greenBufferSize 10, blueBufferSize 10, alphaBufferSize 0, stencilBufferSize -1, samples -1, swapBehavior QSurfaceFormat::DefaultSwapBehavior, swapInterval 1, colorSpace QSurfaceFormat::DefaultColorSpace, profile QSurfaceFormat::NoProfile)
QSurfaceFormat::OpenGL
32857
QSurfaceFormat(version 4.6, options QFlags<QSurfaceFormat::FormatOption>(), depthBufferSize 32, redBufferSize 10, greenBufferSize 10, blueBufferSize 10, alphaBufferSize 0, stencilBufferSize -1, samples -1, swapBehavior QSurfaceFormat::DefaultSwapBehavior, swapInterval 1, colorSpace QSurfaceFormat::DefaultColorSpace, profile QSurfaceFormat::NoProfile)
------------END constructor-----------
----------Start Initalization-----------
QSurfaceFormat(version 4.6, options QFlags<QSurfaceFormat::FormatOption>(DeprecatedFunctions), depthBufferSize 24, redBufferSize 8, greenBufferSize 8, blueBufferSize 8, alphaBufferSize 8, stencilBufferSize 8, samples -1, swapBehavior QSurfaceFormat::DoubleBuffer, swapInterval 1, colorSpace QSurfaceFormat::DefaultColorSpace, profile QSurfaceFormat::NoProfile)
QSurfaceFormat::OpenGL
32857
QSurfaceFormat(version 4.6, options QFlags<QSurfaceFormat::FormatOption>(), depthBufferSize 32, redBufferSize 10, greenBufferSize 10, blueBufferSize 10, alphaBufferSize 0, stencilBufferSize -1, samples -1, swapBehavior QSurfaceFormat::DefaultSwapBehavior, swapInterval 1, colorSpace QSurfaceFormat::DefaultColorSpace, profile QSurfaceFormat::NoProfile)
----------End Initalization-----------
qtdiag.exe
Microsoft Windows [Version 10.0.17763.253]
(c) 2018 Microsoft Corporation. All rights reserved.
C:\Windows\system32>D:\Qt\5.12.1\msvc2017_64\bin\qtdiag.exe
Qt 5.12.1 (x86_64-little_endian-llp64 shared (dynamic) release build; by MSVC 2017) on "windows"
OS: Windows 10 (10.0) [winnt version 10.0.17763]
Architecture: x86_64; features: SSE2 SSE3 SSSE3 SSE4.1 SSE4.2 AVX AVX2
Environment:
Features: QT_NO_EXCEPTIONS
Library info:
PrefixPath: D:\Qt\5.12.1\msvc2017_64
DocumentationPath: D:\Qt\Docs\Qt-5.12.1
HeadersPath: D:\Qt\5.12.1\msvc2017_64\include
LibrariesPath: D:\Qt\5.12.1\msvc2017_64\lib
LibraryExecutablesPath: D:\Qt\5.12.1\msvc2017_64\bin
BinariesPath: D:\Qt\5.12.1\msvc2017_64\bin
PluginsPath: D:\Qt\5.12.1\msvc2017_64\plugins
ImportsPath: D:\Qt\5.12.1\msvc2017_64\imports
Qml2ImportsPath: D:\Qt\5.12.1\msvc2017_64\qml
ArchDataPath: D:\Qt\5.12.1\msvc2017_64
DataPath: D:\Qt\5.12.1\msvc2017_64
TranslationsPath: D:\Qt\5.12.1\msvc2017_64\translations
ExamplesPath: D:\Qt\Examples\Qt-5.12.1
TestsPath: D:\Qt\5.12.1\msvc2017_64\tests
SettingsPath:
Standard paths [*...* denote writable entry]:
DesktopLocation: "Desktop" *C:\Users\dogrt\Desktop*
DocumentsLocation: "Documents" *C:\Users\dogrt\Documents*
FontsLocation: "Fonts" *C:\Windows\Fonts*
ApplicationsLocation: "Applications" *C:\Users\dogrt\AppData\Roaming\Microsoft\Windows\Start Menu\Programs*
MusicLocation: "Music" *C:\Users\dogrt\Music*
MoviesLocation: "Movies" *C:\Users\dogrt\Videos*
PicturesLocation: "Pictures" *C:\Users\dogrt\Pictures*
TempLocation: "Temporary Directory" *C:\Users\dogrt\AppData\Local\Temp*
HomeLocation: "Home" *C:\Users\dogrt*
AppLocalDataLocation: "Application Data" *C:\Users\dogrt\AppData\Local\QtProject\qtdiag* C:\ProgramData\QtProject\qtdiag D:\Qt\5.12.1\msvc2017_64\bin D:\Qt\5.12.1\msvc2017_64\bin\data D:\Qt\5.12.1\msvc2017_64\bin\data\QtProject\qtdiag
CacheLocation: "Cache" *C:\Users\dogrt\AppData\Local\QtProject\qtdiag\cache*
GenericDataLocation: "Shared Data" *C:\Users\dogrt\AppData\Local* C:\ProgramData D:\Qt\5.12.1\msvc2017_64\bin D:\Qt\5.12.1\msvc2017_64\bin\data
RuntimeLocation: "Runtime" *C:\Users\dogrt*
ConfigLocation: "Configuration" *C:\Users\dogrt\AppData\Local\QtProject\qtdiag* C:\ProgramData\QtProject\qtdiag D:\Qt\5.12.1\msvc2017_64\bin D:\Qt\5.12.1\msvc2017_64\bin\data D:\Qt\5.12.1\msvc2017_64\bin\data\QtProject\qtdiag
DownloadLocation: "Download" *C:\Users\dogrt\Downloads*
GenericCacheLocation: "Shared Cache" *C:\Users\dogrt\AppData\Local\cache*
GenericConfigLocation: "Shared Configuration" *C:\Users\dogrt\AppData\Local* C:\ProgramData D:\Qt\5.12.1\msvc2017_64\bin D:\Qt\5.12.1\msvc2017_64\bin\data
AppDataLocation: "Application Data" *C:\Users\dogrt\AppData\Roaming\QtProject\qtdiag* C:\ProgramData\QtProject\qtdiag D:\Qt\5.12.1\msvc2017_64\bin D:\Qt\5.12.1\msvc2017_64\bin\data D:\Qt\5.12.1\msvc2017_64\bin\data\QtProject\qtdiag
AppConfigLocation: "Application Configuration" *C:\Users\dogrt\AppData\Local\QtProject\qtdiag* C:\ProgramData\QtProject\qtdiag D:\Qt\5.12.1\msvc2017_64\bin D:\Qt\5.12.1\msvc2017_64\bin\data D:\Qt\5.12.1\msvc2017_64\bin\data\QtProject\qtdiag
File selectors (increasing order of precedence):
ru_RU windows winnt
Network:
SSL is not supported.
Platform capabilities: ThreadedPixmaps OpenGL ThreadedOpenGL WindowMasks MultipleWindows ForeignWindows NonFullScreenWindows NativeWidgets WindowManagement RasterGLSurface AllGLFunctionsQueryable
Style hints:
mouseDoubleClickInterval: 500
mousePressAndHoldInterval: 800
startDragDistance: 10
startDragTime: 500
startDragVelocity: 0
keyboardInputInterval: 400
keyboardAutoRepeatRate: 32
cursorFlashTime: 1060
showIsFullScreen: 0
showIsMaximized: 0
passwordMaskDelay: 0
passwordMaskCharacter: U+25CF
fontSmoothingGamma: 1.2
useRtlExtensions: 0
setFocusOnTouchRelease: 0
tabFocusBehavior: Qt::TabFocusAllControls
singleClickActivation: 0
Additional style hints (QPlatformIntegration):
ReplayMousePressOutsidePopup: 1
Theme:
Platforms requested : windows
available : snap,flatpak,xdgdesktopportal
Styles requested : WindowsVista,Windows
available : windowsvista,Windows,Fusion
System font : "MS Shell Dlg 2" 8
Native file dialog
Fonts:
General font : "MS Shell Dlg 2" 8
Fixed font : "Courier New" 9
Title font : "MS Shell Dlg 2" 8
Smallest font: "MS Shell Dlg 2" 8
Palette:
QPalette::WindowText: #ff000000
QPalette::Button: #fff0f0f0
QPalette::Light: #ffffffff
QPalette::Midlight: #ffe3e3e3
QPalette::Dark: #ffa0a0a0
QPalette::Mid: #ffa0a0a0
QPalette::Text: #ff000000
QPalette::BrightText: #ffffffff
QPalette::ButtonText: #ff000000
QPalette::Base: #ffffffff
QPalette::Window: #fff0f0f0
QPalette::Shadow: #ff696969
QPalette::Highlight: #ff0078d7
QPalette::HighlightedText: #ffffffff
QPalette::Link: #ff0000ff
QPalette::LinkVisited: #ffff00ff
QPalette::AlternateBase: #ffe9e7e3
QPalette::NoRole: #ff000000
QPalette::ToolTipBase: #ffffffdc
QPalette::ToolTipText: #ff000000
QPalette::PlaceholderText: #80000000
Screens: 1, High DPI scaling: inactive
# 0 "\\.\DISPLAY1" Depth: 32 Primary: yes
Manufacturer:
Model:
Serial number:
Geometry: 1600x1200+0+0 Available: 1600x1160+0+0
Physical size: 432x324 mm Refresh: 60 Hz Power state: 0
Physical DPI: 94.0741,94.0741 Logical DPI: 96,96 Subpixel_None
DevicePixelRatio: 1 Pixel density: 1
Primary orientation: 2 Orientation: 2 Native orientation: 0 OrientationUpdateMask: 0
Dynamic GL LibGL Vendor: NVIDIA Corporation
Renderer: Quadro P400/PCIe/SSE2
Version: 4.6.0 NVIDIA 391.35
Shading language: 4.60 NVIDIA
Format: Version: 4.6 Profile: 2 Swap behavior: 2 Buffer size (RGBA): 8,8,8,8 Depth buffer: 24 Stencil buffer: 8
Profile: None (QOpenGLFunctions_4_6)
Vulkan instance available
Supported instance extensions:
VK_EXT_debug_report, version 9
VK_EXT_display_surface_counter, version 1
VK_KHR_get_physical_device_properties2, version 1
VK_KHR_get_surface_capabilities2, version 1
VK_KHR_surface, version 25
VK_KHR_win32_surface, version 6
VK_KHR_external_fence_capabilities, version 1
VK_KHR_external_memory_capabilities, version 1
VK_KHR_external_semaphore_capabilities, version 1
VK_NV_external_memory_capabilities, version 1
VK_EXT_debug_utils, version 1
Supported layers:
VK_LAYER_NV_optimus, version 1, spec version 1.0.65, NVIDIA Optimus layer
VK_LAYER_LUNARG_standard_validation, version 1, spec version 1.0.92, LunarG Standard Validation Layer
Available physical devices:
API version 1.0.65, vendor 0x10DE, device 0x1CB3, Quadro P400, type 2, driver version 391.140.0
GPU:
Card name : NVIDIA Quadro P400
Driver Name : nvldumdx.dll
Driver Version : 23.21.13.9135
Vendor ID : 0x10DE
Device ID : 0x1CB3
SubSys ID : 0x11BE10DE
Revision ID : 0x00A1
C:\Windows\system32>