gpt4 book ai didi

c++ - Qt 顶点数组不适用于 QImage

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:58:58 27 4
gpt4 key购买 nike

首先,对于问题的长度,我深表歉意。我相信我犯了一些小的、愚蠢的错误,但由于我完全找不到它,我决定发布所有相关代码以防万一。

我终于可以使用 QImage 加载纹理,并且能够在即时模式下渲染纹理。但是,顶点数组不起作用,我不知道为什么。最明显的事情,比如“你启用了顶点数组和纹理坐标数组吗?”可能不是答案。我会发布初始化代码。

这是初始化函数:

    /* general OpenGL initialization function */
int initGL()
{

glShadeModel(GL_SMOOTH); // Enable Smooth Shading
glClearColor(0, 0, 0, 1); // Black Background
glEnable ( GL_COLOR_MATERIAL );
glColorMaterial ( GL_FRONT, GL_AMBIENT_AND_DIFFUSE );


glDisable(GL_DEPTH_TEST);


//ENABLED VERTEX ARRAYS AND TEXTURE COORDINATE ARRAYS
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);

//ENABLED 2D TEXTURING
glEnable ( GL_TEXTURE_2D );
glPixelStorei ( GL_UNPACK_ALIGNMENT, 1 );

glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

//seed random
srand(time(NULL));


return( TRUE );
}

我有 QGLWidget 调用的初始化、调整大小和绘制函数(它本身只是一个调用实际工作函数的框架)

纹理加载函数:

GLuint LoadGLTextures( const char * name )
{
//unformatted QImage
QImage img;
//load the image from a .qrc resource
if(!img.load(":/star.bmp"))
{
qWarning("ERROR LOADING IMAGE");
}

//an OpenGL formatted QImage
QImage GL_formatted_image;
GL_formatted_image = QGLWidget::convertToGLFormat(img);

//error check
if(GL_formatted_image.isNull())
qWarning("IMAGE IS NULL");
else
qWarning("IMAGE NOT NULL");


//texture ID
GLuint _textures[1];


//enable texturing
glEnable(GL_TEXTURE_2D);
//generate textures
glGenTextures(1,&_textures[0]);
//bind the texture
glBindTexture(GL_TEXTURE_2D,_textures[0]);
//texture parameters
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glBindTexture(GL_TEXTURE_2D,_textures[0]);
//generate texture
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, GL_formatted_image.width(),
GL_formatted_image.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE,
GL_formatted_image.bits());




glBindTexture(GL_TEXTURE_2D,_textures[0]);

//return the texture ID
return _textures[0];
}

绘制代码如下:

//this does draw

//get the texture ID
GLuint tex_id = LoadGLTextures(":/star.png");

glBindTexture(GL_TEXTURE_2D, tex_id); // Actually have an array of images



glColor3f(1.0f, 0.0f, 0.5f);
glBegin(GL_QUADS);
glTexCoord2f(1.0f, 0.0f);glVertex2f(1.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f);glVertex2f(1.0f, 1.0f);
glTexCoord2f(0.0f, 1.0f);glVertex2f(0.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f);glVertex2f(0.0f, 0.0f);
glEnd();


//this does not draw

//translations code
glLoadIdentity();
glTranslatef(-1.0f, 0.0f, 0.0f);
//bind the texture
glBindTexture(GL_TEXTURE_2D, tex_id);
//set color state
glColor4f(0.0f, 1.0f, 0.0f, 0.5);

//vertices to be rendered
static GLfloat vertices[] =
{
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 1.0f,
0.0f, 0.0f

};

static GLshort coord_Data[] =
{
1, 0,
1, 1,
0, 1,
0, 0


};

//bind the texture
glBindTexture(GL_TEXTURE_2D, tex_id);
//pointer to the vertex array
glVertexPointer(2, GL_FLOAT, 0, vertices);
//texture coordinate pointer
glTexCoordPointer(2, GL_SHORT, 0, coord_Data);

//draw the arrays
glDrawArrays(GL_QUADS, 0, 4);

感谢大家的帮助,龙纹

最佳答案

一种可能是问题源于在调用 glTexCoordPointer 之前调用 glVertexCoordPointer。当您在顶点坐标之后指定纹理坐标时,会发生奇怪的事情。我知道这适用于使用纹理坐标绘制单个顶点。我不确定数组是否适用。

其他一些事情...

您是否尝试过使用 QPixMap 而不是 QImage?我怀疑这是否是您问题的答案,因为听起来纹理已正确应用于第一个四边形。

有两次调用 bindTexture。

您是否尝试过在代码的第二部分只绘制顶点(没有纹理)?

最后,您是否收到任何编译器警告?

关于c++ - Qt 顶点数组不适用于 QImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5356677/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com