Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.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++ 使用纹理绘制多个对象不会';行不通_C++_Opengl_Glsl - Fatal编程技术网

C++ 使用纹理绘制多个对象不会';行不通

C++ 使用纹理绘制多个对象不会';行不通,c++,opengl,glsl,C++,Opengl,Glsl,我在做一个3D模型加载器。它可以加载我自己的格式。我为Blender编写了自己的导出程序,效果很好。模型格式可以在一个模型中处理多个网格(对象)。每个网格可以具有不同的纹理。我已经编写了一个加载程序,它运行良好,但不使用着色器 我切换到着色器,但出现了一些问题,纹理没有正确显示。这是我的绘图功能,我确信错误在这里的某个地方: void CModel::draw(glm::mat4 &MVP) { glActiveTexture(GL_TEXTURE0); glEnable

我在做一个3D模型加载器。它可以加载我自己的格式。我为Blender编写了自己的导出程序,效果很好。模型格式可以在一个模型中处理多个网格(对象)。每个网格可以具有不同的纹理。我已经编写了一个加载程序,它运行良好,但不使用着色器

我切换到着色器,但出现了一些问题,纹理没有正确显示。这是我的绘图功能,我确信错误在这里的某个地方:

void CModel::draw(glm::mat4 &MVP)
{
    glActiveTexture(GL_TEXTURE0);
    glEnable(GL_TEXTURE_2D);

    for(unsigned int i=0; i<m_numObjects; i++)
    {
        glUseProgram(m_programID);
        glUniformMatrix4fv(m_matrixUniform, 1, GL_FALSE, &MVP[0][0]);

        glBindTexture(GL_TEXTURE_2D, m_textureIDs[i]);
        glUniform1i(m_textureUniform, 0);

        glBindBuffer(GL_ARRAY_BUFFER, m_bufferIDs[i]);

        // vertices
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(
                0,                  // must match the layout in the shader.
                3,                  // size
                GL_FLOAT,           // type
                GL_FALSE,           // normalized?
                sizeof(float)*8,    // stride
                (void*)0            // array buffer offset
        );

        // UVs
        glEnableVertexAttribArray(1);
        glVertexAttribPointer(
                1,
                2,
                GL_FLOAT,
                GL_FALSE,
                sizeof(float)*8,
                (void*)6
        );

        glDrawArrays(GL_TRIANGLES, 0, m_numElements[i]);
        glBindBuffer(GL_ARRAY_BUFFER, 0);

        glUseProgram(0);
    }

    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);
    glDisable(GL_TEXTURE_2D);
}
void CModel::draw(glm::mat4&MVP)
{
玻璃纹理(GL_纹理0);
glEnable(GL_纹理_2D);

对于(unsigned int i=0;i最终我解决了这个问题。问题是我使用一个数组来表示顶点、法线和纹理坐标,而不是存储在单独的数组中并分别绑定它们。

何时以及如何确定统一位置?如果您想安全起见,请在执行glUseProgram.Als后每次使用glGetUniformLocationo、 属性索引从何而来?它们在着色器中的设置在何处?我将glGetUniformLocation放在glUseProgram之后,但它不起作用。索引来自模型文件,但效果很好。
void CModel::draw()
{
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);

    glClientActiveTexture(GL_TEXTURE0);
    glActiveTexture(GL_TEXTURE0);
    glEnable(GL_TEXTURE_2D);

    for(unsigned int i=0; i<m_numObjects; i++)
    {
        glBindTexture(GL_TEXTURE_2D, m_textureIDs[i]);

        glBindBuffer(GL_ARRAY_BUFFER, m_bufferIDs[i]);

        glTexCoordPointer(2, GL_FLOAT, sizeof(float)*8, (float*)(sizeof(float)*6));
        glNormalPointer(     GL_FLOAT, sizeof(float)*8, (float*)(sizeof(float)*3));
        glVertexPointer(  3, GL_FLOAT, sizeof(float)*8, 0);

        glDrawArrays(GL_TRIANGLES, 0, m_numElements[i]);

        glBindBuffer(GL_ARRAY_BUFFER, 0);
    }

    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);

    glDisable(GL_TEXTURE_2D);
}
#include "global.h"
#include "CModel.h"
#include "CModelLoader.h"
#include "CShaderLoader.h"

CModel::CModel(){}

CModel::~CModel()
{
    // TODO free memory
}

/** @brief Load mbm file
  *
  * @fileName: mdm model file name we want to load and draw
  */
void CModel::init(char *fileName)
{
    CModelLoader   loader;
    CShaderLoader  shaders;

    loader.loadData(fileName);

    loader.createDataArray( m_dataArray,
                            m_dataArraySizes,
                            m_numObjects,
                            m_numElements,
                            m_textureIDs );

    glGenVertexArrays(1, &m_vertexArrayID);
    glBindVertexArray(m_vertexArrayID);

    m_programID      = shaders.loadShaders("vertexshader.vert", "fragmentshader.frag");

    m_bufferIDs      = new unsigned int[m_numObjects];

    glGenBuffers(m_numObjects, m_bufferIDs);
    for(unsigned int i=0; i<m_numObjects; i++)
    {
        glBindBuffer(GL_ARRAY_BUFFER, m_bufferIDs[i]);
        glBufferData(GL_ARRAY_BUFFER, sizeof(float)*m_dataArraySizes[i], m_dataArray[i], GL_STATIC_DRAW);
    }

}

/** @brief Drawing the mdm model
  *
  */
void CModel::draw(glm::mat4 &MVP)
{

    glEnable(GL_TEXTURE_2D);
    glActiveTexture(GL_TEXTURE0);

    for(unsigned int i=0; i<m_numObjects; i++)
    {
        glUseProgram(m_programID);

        unsigned int matrixUniform  = glGetUniformLocation(m_programID, "MVP");
        unsigned int textureUniform = glGetUniformLocation(m_programID, "myTextureSampler");

        glUniformMatrix4fv(matrixUniform, 1, GL_FALSE, &MVP[0][0]);
        glUniform1i(textureUniform, 0);

        glBindTexture(GL_TEXTURE_2D, m_textureIDs[i]);
        glBindBuffer(GL_ARRAY_BUFFER, m_bufferIDs[i]);

        // vertices
        glEnableVertexAttribArray(0);
        glVertexAttribPointer(
                0,                  // must match the layout in the shader.
                3,                  // size
                GL_FLOAT,           // type
                GL_FALSE,           // normalized?
                sizeof(float)*8,    // stride
                (void*)0            // array buffer offset
        );

        // UVs
        glEnableVertexAttribArray(1);
        glVertexAttribPointer(
                1,
                2,
                GL_FLOAT,
                GL_FALSE,
                sizeof(float)*8,
                (void*)6
        );

        glDrawArrays(GL_TRIANGLES, 0, m_numElements[i]);
        glBindBuffer(GL_ARRAY_BUFFER, 0);

        glUseProgram(0);
    }

    glDisableVertexAttribArray(0);
    glDisableVertexAttribArray(1);



    glDisable(GL_TEXTURE_2D);
}