【问题标题】:OpenGl Rendering .obj file issueOpenGL 渲染 .obj 文件问题
【发布时间】:2016-11-08 23:10:17
【问题描述】:

我正在尝试使用我构建的 .obj 文件加载器加载 .obj 文件,它似乎工作正常(在加载方面)。

话虽如此,当我将 3d 对象绘制到屏幕上时,它会创建一个大红色方块

GLenum err = glewInit();
if (err != GLEW_OK)
{
    std::cout << "NOT WORKING" << std::endl;
}
const char* vertexShaderSource = "#version 330\n\
    in vec4 position;\
    void main(void) {\
        gl_Position = position;\
    }";

// compile fragment shader source
const GLchar* fragmentShaderSource = "#version 330\n\
    out vec4 fragColor;\
    void main(void) {\
        fragColor = vec4(1.0,0.3,0.3,0.15);\
    }";

/* Creating Shader */
this->programId = glCreateProgram();
this->vId = glCreateShader(GL_VERTEX_SHADER);
this->fId = glCreateShader(GL_FRAGMENT_SHADER);

/* Get Shader Size */
int vertexShaderLength = strlen(vertexShaderSource);
int fragmentShaderLength = strlen(fragmentShaderSource);

/* Loading and binding shader */
glShaderSource(this->vId, 1, &vertexShaderSource, NULL);
glShaderSource(this->fId, 1, &fragmentShaderSource, NULL);

/* Compile Shaders */
glCompileShader(vId);
int iIsOk = 0;
glGetShaderiv(this->vId, GL_COMPILE_STATUS, &iIsOk);
if (!iIsOk)
{
    return;
}
int iIsOk2;
glCompileShader(fId);
glGetShaderiv(this->fId, GL_COMPILE_STATUS, &iIsOk2);
if (!iIsOk2)
{
    std::cout << "U SUCK!" << std::endl;
    std::cout << glGetError() << std::endl;
}

/* Attach Shaders */
glAttachShader(this->programId, this->vId);
glAttachShader(this->programId, this->fId);

/* Bind Attributes from Shader */
glBindAttribLocation(this->programId, 0, "position");
glBindFragDataLocation(this->programId, 0, "fragcolor");

/* Link gprogram */
glLinkProgram(this->programId);

/* Use and bind attribute */
glUseProgram(this->programId);
this->positionId = glGetAttribLocation(this->programId, "position");
glUseProgram(0);

/* VAO Time */
glGenVertexArrays(1, &this->vaoId);
glBindVertexArray(this->vaoId);

/* VBO Time assigning to VAO */
glGenBuffers(1, &this->vboId);
glBindBuffer(GL_ARRAY_BUFFER, this->vboId);
glBufferData(GL_ARRAY_BUFFER, vertcies.size() * sizeof(sf::Vector3f), &vertcies[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(this->positionId);
glVertexAttribPointer(this->positionId, 3, GL_FLOAT, GL_FALSE, sizeof(sf::Vector3f), 0);

/* Close out bindings */
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);

画图:

glUseProgram(this->programId);
glBindVertexArray(this->vaoId);
glDrawArrays(GL_TRIANGLES, 0, this->vertcies.size());
glBindVertexArray(0);
glUseProgram(0);

我上传了一张红框显示的图片。

我很好奇我是否遗漏了 openGL 代码中的某些内容或我做错了什么?

我能够正确显示一个三角形,但是当我加载我的 .obj 文件时,这是我显示的内容。

以上是我项目中的所有openGL代码,是不是我的代码有简单的错误……或者忘记了什么?

【问题讨论】:

  • 为什么在glVertexAttribPointer() 调用中为位置指定2 个组件?你不是用 3D 坐标吗?
  • @Reto Koradi 我猜我对整个交易的运作方式非常困惑。我将其更改为 3,但仍然遇到相同的问题,但是我确实更新了代码以向您展示我所做的确切更改。
  • 没有定义视图矩阵,阴影是纯色。你期待看到什么结果?另外,您确定您的顶点在不定义元素的情况下正确布局以进行渲染吗?我建议从全面的 opengl 教程开始,例如open.gl

标签: c++ opengl opengl-4


【解决方案1】:

你需要使用模型矩阵和视图矩阵...

如果没有这些矩阵,您的对象将填满屏幕,因为您正在本地空间中查看它,并且该状态下屏幕的像素坐标值介于 0 和 1 之间。

我猜您的对象的顶点坐标超出了 0 或 1。这就是您无法完整查看它的原因。

然后,如果您在着色器中使用硬编码颜色,您的对象将无法正确查看。

即使您的对象是一个立方体,您仍然会看到一个四边形。 所以要么使用光照或纹理,要么尝试改变每个顶点的颜色。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2014-04-06
    • 2013-12-11
    • 2012-09-13
    • 2015-05-20
    • 2013-06-06
    • 2011-10-17
    • 1970-01-01
    • 2012-10-30
    • 2020-05-12
    相关资源
    最近更新 更多