【问题标题】:openGL migration from SFML to glut, vertices arrays or display lists are not displayedopenGL 从 SFML 迁移到 glut,顶点数组或显示列表不显示
【发布时间】:2014-08-21 09:14:04
【问题描述】:

由于使用四缓冲立体 3D(我还没有包括在内),我需要将我的 openGL 程序从 SFML 窗口迁移到 glut 窗口。 使用 SFML,我的顶点和显示列表可以正确显示,现在使用 glut,我的窗口是空白的白色(或其他颜色,取决于我清除它的方式)。

这是初始化窗口的代码:

    int type;
    int stereoMode = 0;
    if ( stereoMode == 0 )
        type = GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH;
    else
        type = GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_STEREO;
    glutInitDisplayMode(type);
    int argc = 0;
    char *argv = "";
    glewExperimental = GL_TRUE; 
    glutInit(&argc, &argv);

    bool fullscreen = false;
    glutInitWindowSize(width,height);
    int win = glutCreateWindow(title.c_str());
    glutSetWindow(win);
    assert(win != 0);
    if ( fullscreen ) {
        glutFullScreen();
        width = glutGet(GLUT_SCREEN_WIDTH);
        height = glutGet(GLUT_SCREEN_HEIGHT);
    }


    GLenum err = glewInit();
    if (GLEW_OK != err) {
        fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
    }

    glutDisplayFunc(loop_function);

这是我现在必须更改的唯一代码,但这是我与 sfml 一起使用并在循环中显示我的对象的代码,如果我更改 glClearColor 的值,窗口的背景确实会更改颜色,因此 opengl 上下文似乎正在工作:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(255.0f, 255.0f, 255.0f, 0.0f);

glLoadIdentity();
sf::Time elapsed_time = clock.getElapsedTime();
clock.restart();

camera->animate(elapsed_time.asMilliseconds());
camera->look();

for (auto i = objects->cbegin(); i != objects->cend(); ++i)
        (*i)->draw(camera);

glutSwapBuffers();

我应该做任何其他更改以切换到 glut 吗?如果有人能在这个问题上启发我,那就太好了。

除此之外,我发现添加太多对象(之前使用 SFML 处理得很好),openGL 会给出错误 1285:内存不足。也许这是相关的。

编辑: 这是我用来绘制每个对象的代码,也许是问题所在:

GLuint LightID = glGetUniformLocation(this->shaderProgram, "LightPosition_worldspace");
if(LightID ==-1)
    cout << "LightID not found ..." << endl;
GLuint MaterialAmbientID = glGetUniformLocation(this->shaderProgram, "MaterialAmbient");
if(LightID ==-1)
    cout << "LightID not found ..." << endl;
GLuint MaterialSpecularID = glGetUniformLocation(this->shaderProgram, "MaterialSpecular");
if(LightID ==-1)
    cout << "LightID not found ..." << endl;

glm::vec3 lightPos = glm::vec3(0,150,150);
glUniform3f(LightID, lightPos.x, lightPos.y, lightPos.z);
glUniform3f(MaterialAmbientID, MaterialAmbient.x, MaterialAmbient.y, MaterialAmbient.z);
glUniform3f(MaterialSpecularID, MaterialSpecular.x, MaterialSpecular.y, MaterialSpecular.z);


// Get a handle for our "myTextureSampler" uniform
    GLuint TextureID  = glGetUniformLocation(shaderProgram, "myTextureSampler");
    if(!TextureID)
        cout << "TextureID not found ..." << endl;
    glActiveTexture(GL_TEXTURE0);
    sf::Texture::bind(texture);
    glUniform1i(TextureID, 0);
// 2nd attribute buffer : UV
    GLuint vertexUVID = glGetAttribLocation(shaderProgram, "color");
    if(vertexUVID==-1)
        cout << "vertexUVID not found ..." << endl;
    glEnableVertexAttribArray(vertexUVID);
    glBindBuffer(GL_ARRAY_BUFFER, color_array_buffer);
    glVertexAttribPointer(vertexUVID, 2, GL_FLOAT, GL_FALSE, 0, 0);  


GLuint vertexNormal_modelspaceID = glGetAttribLocation(shaderProgram, "normal");
if(!vertexNormal_modelspaceID)
    cout << "vertexNormal_modelspaceID not found ..." << endl;
glEnableVertexAttribArray(vertexNormal_modelspaceID);
glBindBuffer(GL_ARRAY_BUFFER, normal_array_buffer);
glVertexAttribPointer(vertexNormal_modelspaceID, 3, GL_FLOAT, GL_FALSE, 0, 0 );


GLint posAttrib;
posAttrib = glGetAttribLocation(shaderProgram, "position");
if(!posAttrib)
    cout << "posAttrib not found ..." << endl;

glEnableVertexAttribArray(posAttrib);
glBindBuffer(GL_ARRAY_BUFFER, position_array_buffer);
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elements_array_buffer);

glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
GLuint error;
while ((error = glGetError()) != GL_NO_ERROR) {
    cerr << "OpenGL error: " << error << endl;
}

disableShaders();

【问题讨论】:

  • 不错的举动。我从过剩到 SFML,现在又回来了。

标签: opengl glut sfml vertex-shader


【解决方案1】:

代码很好,从 SFML 迁移到 glut 不需要很多更改,但如果您使用 SFML 纹理对象,则必须更改纹理。除了背景颜色变化之外,您看不到任何其他东西的唯一方法仅仅是因为您的相机没有看到您的物体。 我建议您检查您的视图代码并或发布它。

【讨论】:

  • 谢谢,我没有正确初始化相机的属性。正如你所说的对象是黑色的,所以我将不得不更改纹理对象。
猜你喜欢
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多