Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.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
C++ 在Mac OSX el capitan上使用Qt 5.7在OpenGL 2.1中创建纹理矩形_C++_Macos_Qt_Opengl_Osx Elcapitan - Fatal编程技术网

C++ 在Mac OSX el capitan上使用Qt 5.7在OpenGL 2.1中创建纹理矩形

C++ 在Mac OSX el capitan上使用Qt 5.7在OpenGL 2.1中创建纹理矩形,c++,macos,qt,opengl,osx-elcapitan,C++,Macos,Qt,Opengl,Osx Elcapitan,我正在做一个项目,我需要用OpenGL 2.1在Qt5.7中创建一个纹理矩形。我使用Qt的QOpenGLWidget编写了这个最小的示例: #包括 #包括 #包括“openglwidget.h” OpenGLWidget::OpenGLWidget(QWidget*父项):QOpenGLWidget(父项) { } void OpenGLWidget::initializeGL(){ 初始化EnglFunctions(); glClearColor(0,0,0,1); /**顶点着色器**/ 常

我正在做一个项目,我需要用OpenGL 2.1在Qt5.7中创建一个纹理矩形。我使用Qt的QOpenGLWidget编写了这个最小的示例:

#包括
#包括
#包括“openglwidget.h”
OpenGLWidget::OpenGLWidget(QWidget*父项):QOpenGLWidget(父项)
{
}
void OpenGLWidget::initializeGL(){
初始化EnglFunctions();
glClearColor(0,0,0,1);
/**顶点着色器**/
常量字符*顶点着色器=”\
属性向量2位\
属性向量2 texCoord\
可变矢量2 TexCoord\
void main(){\
gl_Position.xy=pos.xy\
gl_Position.zw=vec2(0,1)\
TexCoord=TexCoord\
}\
";
闪烁顶点源长度=strlen(顶点着色器);
GLuint vertexShaderObject=glCreateShader(GL_VERTEX_着色器);
glShaderSource(vertexShaderObject,1,&vertexShader,&vertexSourceLength);
glCompileShader(vertexShaderObject);
闪烁结果;
glGetShaderiv(vertexShaderObject、GL\u编译状态和结果);
如果(结果!=GL\u真){

qDebug()问题在于用于纹理数据的数据类型:

GLuint pixels[] = {
    255, 0, 0, 255,     255, 0, 0, 255,     255, 0, 0, 255,     255, 0, 0, 255,
    255, 0, 0, 255,     255, 0, 0, 255,     255, 0, 0, 255,     255, 0, 0, 255,
    255, 0, 0, 255,     255, 0, 0, 255,     255, 0, 0, 255,     255, 0, 0, 255,
    255, 0, 0, 255,     255, 0, 0, 255,     255, 0, 0, 255,     255, 0, 0, 255
};
由于您对类型使用了
GLuint
,并且匹配的
GL\u UNSIGNED\u INT
作为
glTexImage2D()
的类型参数,这些值将被解释为32位无符号值。而255实际上是一个非常小的32位值,这解释了为什么会变黑

换句话说,
glTexImage2D()
根据类型将传入的值解释为标准化定点值。要获得[0.0,1.0]范围内的实际标准化值,在32位值的情况下,它会将传入的值除以2^32-1。因此,在您的情况下,结果值将为255/(2^32-1)=0.00000005937。该值接近于0,因此为黑色

要解决此问题,最简单的方法是对类型使用字节:

GLubyte pixels[] = {
...
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

我找到了我问题的答案!事实证明,你必须在glDrawArrays开始工作之前调用glBindTexture。initializeGL和paintGL与Qt之间发生了一些事情,这会解除纹理绑定并绑定另一个纹理。对于感兴趣的人,我通过使用glGetTexImage调试发现了这一点,这将是一个非常有用的函数函数用于调试(尽管它显然很慢)。

谢谢,这实际上是我发布的示例的一个问题,在原始项目中,它是GL_UNSIGNED_BYTE,而不是GL_UNSIGNED_INT。我将用正确的类型编辑我的问题。不幸的是,它仍然不起作用:(当您告诉OpenGL您的数据是
GL_UNSIGNED_BYTE
(每个通道1字节)您还必须提供这些数据。目前您仍然有4字节的GLuint。您必须将其更改为
GLubyte
@BDL Yeah抱歉..示例和原始项目之间的另一个区别。原始代码的两种数据类型都是GLubyte。这两种类型都不起作用。@WilliamOliver请不要以无效的方式编辑问题这不是这个网站的工作方式。@RetoKoradi在这种情况下我应该怎么做?当然不值得添加一个全新的问题。
GLubyte pixels[] = {
...
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);