这是我第二次制作游戏引擎,但是现在有点卡住了,因为我无法弄清楚为什么会发生这种情况,无论我发送什么对象,OpenGL只会在其上绘制白色三角形屏幕中心like this.
我什至已经将我的旧代码从Renderer和Camera Objects上的上一个引擎中复制了,仍然表现相同,所以我猜测它与Render Script有关。
渲染器:
Renderer2D::Renderer2D(const Shader& shader) {
this->shader = shader;
this->Init();
}
Renderer2D::~Renderer2D() {
glDeleteVertexArrays(1, &this->QuadVAO);
}
void Renderer2D::Render(Texture & texture, iVec2 position, iVec2 size, float rotation, iVec3 color) {
this->shader.Use();
iMat4 model;
using namespace glm;
model = translate(model, iVec3(position.x, position.y, 0.0f));
/*
model = translate(model, iVec3(size.x * 0.5f, size.y * 0.5f, 0.0f));
model = rotate(model, rotation, iVec3(0.0f, 0.0f, 1.0f));
model = translate(model, iVec3(size.x * -0.5f, size.y * -0.5f, 0.0f));
*/
model = glm::scale(model, iVec3(size.x, size.y, 1.0f));
this->shader.SetMatrix4("model2D", model);
this->shader.SetVector3f("color2D", color);
glActiveTexture(GL_TEXTURE0);
texture.Bind();
glBindVertexArray(this->QuadVAO);
glDrawArrays(GL_TRIANGLES, 0, 6);
glBindVertexArray(0);
}
void Renderer2D::Init() {
U16 VBO;
float vertices[] = {
// Pos // Tex
0.0f, 1.0f, 0.0f, 1.0f,
1.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, 1.0f,
1.0f, 1.0f, 1.0f, 1.0f,
1.0f, 0.0f, 1.0f, 0.0f
};
glGenVertexArrays(1, &this->QuadVAO);
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBindVertexArray(this->QuadVAO);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
}
顶点着色器:
#version 330 core
layout (location = 0) in vec4 vertex; // <vec2 position, vec2 texCoords>
out vec2 TexCoords;
uniform mat4 view2D;
uniform mat4 model2D;
uniform mat4 projection2D;
void main()
{
TexCoords = vertex.zw;
gl_Position = projection2D * view2D * mode2Dl * vec4(vertex.xy, 0.0, 1.0);
}
编辑:
顶点着色器:
#version 330 core
layout (location = 0) in vec4 vertex; // <vec2 position, vec2 texCoords>
out vec2 TexCoords;
uniform mat4 view2D;
uniform mat4 model2D;
uniform mat4 projection2D;
void main()
{
TexCoords = vertex.zw;
gl_Position = projection2D * view2D * model2D * vec4(vertex.xy, 0.0, 1.0);
}
片段着色器:
#version 330 core
in vec2 TexCoords;
out vec4 color2D; //Fixed the error!
uniform sampler2D image2D;
uniform vec3 color2D;
void main()
{
color2D = vec4(color2D, 1.0) * texture(image2D, TexCoords);
}
Resources.cpp
Shader Resources::LoadShaderFromFile(const char * vertexSource, const char * fragmentSource) {
using namespace std;
string vertexCode;
string fragmentCode;
try {
ifstream vertexShaderFile(vertexSource);
ifstream fragmentShaderFile(fragmentSource);
stringstream vShaderStream, fShaderStream;
vShaderStream << vertexShaderFile.rdbuf();
fShaderStream << fragmentShaderFile.rdbuf();
vertexShaderFile.close();
fragmentShaderFile.close();
vertexCode = vShaderStream.str();
fragmentCode = fShaderStream.str();
}
catch (exception e) {
cout << "ERROR::SHADER: Failed to read shader files" << std::endl;
}
const char *vShaderCode = vertexCode.c_str();
const char *fShaderCode = fragmentCode.c_str();
Shader shader;
shader.Compile(vShaderCode, fShaderCode);
return shader;
}
答案 0 :(得分:5)
您的着色器甚至不编译。声明矩阵制服时,请使用名称model2D
,view2D
和projection2D
:
uniform mat4 view2D;
uniform mat4 model2D;
uniform mat4 projection2D;
但是当您使用矩阵时,则使用名称view
,model
和projection
:
gl_Position = projection * view * model * vec4(vertex.xy, 0.0, 1.0);
我建议检查着色器对象是否成功编译以及程序对象链接是否成功。
如果可以成功通过glGetShaderiv
和参数GL_COMPILE_STATUS
检查着色器的编译。
例如
GLuint shaderObj = .... ;
glCompileShader( shaderObj );
GLint status = GL_TRUE;
glGetShaderiv( shaderObj, GL_COMPILE_STATUS, &status );
if ( status == GL_FALSE )
{
GLint logLen;
glGetShaderiv( shaderObj, GL_INFO_LOG_LENGTH, &logLen );
std::vector< char >log( logLen );
GLsizei written;
glGetShaderInfoLog( shaderObj, logLen, &written, log.data() );
std::cout << "compile error:" << std::endl << log.data() << std::endl;
}
如果程序链接成功,可以通过glGetProgramiv
和参数GL_LINK_STATUS
进行检查。
例如
GLuint progObj = ....;
glLinkProgram( progObj );
GLint status = GL_TRUE;
glGetProgramiv( progObj, GL_LINK_STATUS, &status );
if ( status == GL_FALSE )
{
GLint logLen;
glGetProgramiv( progObj, GL_INFO_LOG_LENGTH, &logLen );
std::vector< char >log( logLen );
GLsizei written;
glGetProgramInfoLog( progObj, logLen, &written, log.data() );
std::cout << "link error:" << std::endl << log.data() << std::endl;
}