我正在尝试使用我构建的.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);
DRAW:
glUseProgram(this->programId);
glBindVertexArray(this->vaoId);
glDrawArrays(GL_TRIANGLES, 0, this->vertcies.size());
glBindVertexArray(0);
glUseProgram(0);
我上传了红框显示的图像。
我很好奇我是否遗漏了openGL代码中的内容或者我做错了什么?
我可以正确显示三角形,但是当我去加载我的.obj文件时,这就是我显示的内容。
以上是我在项目中使用的所有openGL代码,我的代码中是否有一个简单的错误......或者遗忘了什么?
答案 0 :(得分:0)
您需要使用模型矩阵和视图矩阵......
如果没有这些矩阵,您的对象将填满屏幕,因为您正在本地空间中查看它,并且该状态下屏幕的像素坐标的值介于0和1之间。
我猜你的对象的顶点坐标超过0或1.这就是你无法完全查看它的原因。
然后,如果在着色器中使用硬编码颜色,则无法正确查看对象。
即使您的对象是立方体,您仍然会看到四边形。 所以要么使用光照或纹理 - 要么尝试改变每个顶点的颜色。
希望它有所帮助。