使用glDrawArrays时,在iOS中打开GL渲染不正确(GL_三角形,0,numVert);

使用glDrawArrays时,在iOS中打开GL渲染不正确(GL_三角形,0,numVert);,ios,ipad,opengl-es,render,Ios,Ipad,Opengl Es,Render,我使用以下代码为OpenGL渲染.h文件。 然而,最终的结果是三角形的,而不是全部。请参阅所附图片。谁能告诉我为什么会发生这种事。因为我是新开GL的 我想开发一个像这样的应用程序- -(无效)渲染框架 { [自设置帧缓冲区]; //清晰的颜色和深度缓冲区 glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位); //渲染视频背景并检索跟踪状态 QCAR::State=QCAR::Renderer::getInstance().begin(); QCAR::Renderer::getIns

我使用以下代码为OpenGL渲染.h文件。 然而,最终的结果是三角形的,而不是全部。请参阅所附图片。谁能告诉我为什么会发生这种事。因为我是新开GL的

我想开发一个像这样的应用程序-

-(无效)渲染框架
{
[自设置帧缓冲区];
//清晰的颜色和深度缓冲区
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
//渲染视频背景并检索跟踪状态
QCAR::State=QCAR::Renderer::getInstance().begin();
QCAR::Renderer::getInstance().drawVideoBackground();
//NSLog(@“活动可跟踪项:%d”,state.getNumActiveTrackables());
if(QCAR::GL_11和qUtils.QCARFlags){
glEnable(GL_纹理_2D);
glEnable(德国劳埃德大学照明);
glEnableClientState(GL_顶点_数组);
glEnableClientState(GL_普通_阵列);
glEnableClientState(GL_纹理_坐标_阵列);
}
glEnable(GLU深度试验);
//我们必须检测背景反射是否活跃,并调整剔除方向。
//如果反射处于活动状态,则表示姿势矩阵也已反射,
//因此,标准的逆时针面剔除将导致“由内而外”的模型。
glEnable(GL_CULL_面);
正面(背面);
如果(QCAR::Renderer::getInstance().getVideoBackgroundConfig().mReflection==QCAR::VIDEO\u BACKGROUND\u REFLECTION\u ON)
glFrontFace(GL_CW);//前摄像头
其他的
glFrontFace(GL_CCW);//后摄像头
对于(int i=0;igetTrackable();
QCAR::Matrix44F modelViewMatrix=QCAR::Tool::convertPose2GLMatrix(结果->getPose());
//基于目标名称选择纹理
int targetIndex=0;/“石头”
如果(!strcmp(trackable.getName(),“chips”))
targetIndex=1;
否则如果(!strcmp(trackable.getName(),“tarmac”))
targetIndex=2;
Object3D*obj3D=[objects3D objectAtIndex:targetIndex];
//使用适当版本的OpenGL进行渲染
if(QCAR::GL_11和qUtils.QCARFlags){
//加载投影矩阵
glMatrixMode(GL_投影);
glLoadMatrixf(qUtils.projectionMatrix.data);
//加载模型视图矩阵
glMatrixMode(GLU模型视图);
glLoadMatrixf(modelViewMatrix.data);
glTranslatef(0.0f,0.0f,-kObjectScale);
glScalef(kObjectScale,kObjectScale,kObjectScale);
//绘图对象
glBindTexture(GL_TEXTURE_2D,[obj3D.TEXTURE textureID]);
glTexCoordPointer(2,GL_FLOAT,0,(常量GLvoid*)obj3D.texCoords);
glVertexPointer(3,GL_FLOAT,0,(常量GLvoid*)obj3D.顶点);
glVertexPointer(3,GLU浮动,0,迈凯轮车队);
glNormalPointer(GL_FLOAT,0,麦克拉伦标准);
glTexCoordPointer(2,GLU浮点,0,迈凯轮车队);
//绘制数据
GLDRAWARRAY(GLU三角形,0,麦克拉伦方阵);
}
#ifndef使用OPENGL1
否则{
//OpenGL2
QCAR::Matrix44F modelViewProjection;
ShaderUtils::translatePosteMatrix(0.0f、0.0f、kObjectScale和modelViewMatrix.data[0]);
ShaderUtils::scalePosteMatrix(kObjectScale、kObjectScale、kObjectScale和modelViewMatrix.data[0]);
ShaderUtils::multilyMatrix(&qUtils.projectionMatrix.data[0],&modelViewMatrix.data[0],&modelViewProjection.data[0]);
glUseProgram(shaderProgramID);
glvertexattributepointer(vertexHandle,3,GL_FLOAT,GL_FALSE,0,(const GLvoid*)obj3D.顶点);
glvertexattributepointer(normalHandle,3,GL_FLOAT,GL_FALSE,0,(const GLvoid*)obj3D.normals);
glvertexattributepointer(textureCordHandle,2,GL_FLOAT,GL_FALSE,0,(const GLvoid*)obj3D.texCoords);
GlenableVertexAttributeArray(vertexHandle);
GlenableVertexAttributeArray(normalHandle);
GlenableVertexAttributeArray(TextureCordHandle);
玻璃纹理(GL_纹理0);
glBindTexture(GL_TEXTURE_2D,[obj3D.TEXTURE textureID]);
glUniformMatrix4fv(mvpMatrixHandle,1,GL_FALSE,(const GLfloat*)和modelViewProjection.data[0]);
glUniform1i(texhandle,0/*GL_TEXTURE0*/);
glVertexPointer(3,GLU浮动,0,迈凯轮车队);
glNormalPointer(GL_FLOAT,0,麦克拉伦标准);
glTexCoordPointer(2,GLU浮点,0,迈凯轮车队);
//绘制数据
GLDRAWARRAY(GLU三角形,0,麦克拉伦方阵);
ShaderUtils::checkleror(“EAGLView renderFrameQCAR”);
}
#恩迪夫
}
glDisable(GLU深度测试);
glDisable(GLU消隐面);
if(QCAR::GL_11和qUtils.QCARFlags){
glDisable(GL_纹理_2D);
glDisableClientState(GL_顶点_数组);
glDisableClientState(GL_NORMAL_数组);
glDisableClientState(GL_纹理_坐标_数组);
} 
#ifndef使用OPENGL1
否则{
GLDisableVertexAttributeArray(vertexHandle);
glDisableVertexAttributeArray(normalHandle);
glDisableVertexAttributeArray(TextureCordHandle);
}
#恩迪夫
QCAR::Renderer::getInstance().end();
[自存在帧缓冲区];
}

好的。我发现了问题。碰巧我的设计师给了我一个具有四边形渲染的文件,其中as Vuforia Qualcomm Unity等只识别三角形.obj。对于任何被困在这里的人:)只需让你的设计师知道以三角形而不是四边形渲染即可

- (void)renderFrameQCAR
{
    [self setFramebuffer];

// Clear colour and depth buffers
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// Render video background and retrieve tracking state
QCAR::State state = QCAR::Renderer::getInstance().begin();
QCAR::Renderer::getInstance().drawVideoBackground();

//NSLog(@"active trackables: %d", state.getNumActiveTrackables());

if (QCAR::GL_11 & qUtils.QCARFlags) {
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_LIGHTING);
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
}

glEnable(GL_DEPTH_TEST);

// We must detect if background reflection is active and adjust the culling direction. 
// If the reflection is active, this means the pose matrix has been reflected as well,
// therefore standard counter clockwise face culling will result in "inside out" models. 
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
if(QCAR::Renderer::getInstance().getVideoBackgroundConfig().mReflection == QCAR::VIDEO_BACKGROUND_REFLECTION_ON)
    glFrontFace(GL_CW);  //Front camera
else
    glFrontFace(GL_CCW);   //Back camera

for (int i = 0; i < state.getNumTrackableResults(); ++i) {

    // Get the trackable
    const QCAR::TrackableResult* result = state.getTrackableResult(i);
    const QCAR::Trackable& trackable = result->getTrackable();
    QCAR::Matrix44F modelViewMatrix = QCAR::Tool::convertPose2GLMatrix(result->getPose());

    // Choose the texture based on the target name
    int targetIndex = 0; // "stones"
    if (!strcmp(trackable.getName(), "chips"))
        targetIndex = 1;
    else if (!strcmp(trackable.getName(), "tarmac"))
        targetIndex = 2;

    Object3D *obj3D = [objects3D objectAtIndex:targetIndex];

    // Render using the appropriate version of OpenGL
    if (QCAR::GL_11 & qUtils.QCARFlags) {
        // Load the projection matrix
        glMatrixMode(GL_PROJECTION);
        glLoadMatrixf(qUtils.projectionMatrix.data);

        // Load the model-view matrix
        glMatrixMode(GL_MODELVIEW);
        glLoadMatrixf(modelViewMatrix.data);
        glTranslatef(0.0f, 0.0f, -kObjectScale);
        glScalef(kObjectScale, kObjectScale, kObjectScale);

        // Draw object
        glBindTexture(GL_TEXTURE_2D, [obj3D.texture textureID]);
        glTexCoordPointer(2, GL_FLOAT, 0, (const GLvoid*)obj3D.texCoords);
        glVertexPointer(3, GL_FLOAT, 0, (const GLvoid*)obj3D.vertices);

        glVertexPointer(3, GL_FLOAT, 0, MclarenInfoVerts);
        glNormalPointer(GL_FLOAT, 0, MclarenInfoNormals);
        glTexCoordPointer(2, GL_FLOAT, 0, MclarenInfoTexCoords);

        // draw data
        glDrawArrays(GL_TRIANGLES, 0, MclarenInfoNumVerts);


    }
#ifndef USE_OPENGL1
    else {
        // OpenGL 2
        QCAR::Matrix44F modelViewProjection;

        ShaderUtils::translatePoseMatrix(0.0f, 0.0f, kObjectScale, &modelViewMatrix.data[0]);
        ShaderUtils::scalePoseMatrix(kObjectScale, kObjectScale, kObjectScale, &modelViewMatrix.data[0]);
        ShaderUtils::multiplyMatrix(&qUtils.projectionMatrix.data[0], &modelViewMatrix.data[0], &modelViewProjection.data[0]);

        glUseProgram(shaderProgramID);

        glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)obj3D.vertices);
        glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)obj3D.normals);
        glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)obj3D.texCoords);

        glEnableVertexAttribArray(vertexHandle);
        glEnableVertexAttribArray(normalHandle);
        glEnableVertexAttribArray(textureCoordHandle);

        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, [obj3D.texture textureID]);
        glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, (const GLfloat*)&modelViewProjection.data[0]);
        glUniform1i(texSampler2DHandle, 0 /*GL_TEXTURE0*/);

        glVertexPointer(3, GL_FLOAT, 0, MclarenInfoVerts);
        glNormalPointer(GL_FLOAT, 0, MclarenInfoNormals);
        glTexCoordPointer(2, GL_FLOAT, 0, MclarenInfoTexCoords);



        // draw data
        glDrawArrays(GL_TRIANGLES, 0, MclarenInfoNumVerts);


        ShaderUtils::checkGlError("EAGLView renderFrameQCAR");
    }
#endif
}

glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);

if (QCAR::GL_11 & qUtils.QCARFlags) {
    glDisable(GL_TEXTURE_2D);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
} 
#ifndef USE_OPENGL1
else {
    glDisableVertexAttribArray(vertexHandle);
    glDisableVertexAttribArray(normalHandle);
    glDisableVertexAttribArray(textureCoordHandle);
}
#endif

QCAR::Renderer::getInstance().end();
[self presentFramebuffer];
}