Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.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++ OpenGL着色器扩展了geomatry_C++_Opengl_Shader - Fatal编程技术网

C++ OpenGL着色器扩展了geomatry

C++ OpenGL着色器扩展了geomatry,c++,opengl,shader,C++,Opengl,Shader,我创建了一个简单的程序来渲染四边形 初始化: Math::float3 vertices[4]; vertices[0] = Math::float3(-0.5f, 0.5f, -1.0f); vertices[1] = Math::float3(-0.5f, -0.5f, -1.0f); vertices[2] = Math::float3(0.5f, -0.5f, -1.0f); vertices[3] = Math::float3(0.5f, 0.5f, -1.0f); glGenBuf

我创建了一个简单的程序来渲染四边形

初始化:

Math::float3 vertices[4];
vertices[0] = Math::float3(-0.5f, 0.5f, -1.0f);
vertices[1] = Math::float3(-0.5f, -0.5f, -1.0f);
vertices[2] = Math::float3(0.5f, -0.5f, -1.0f);
vertices[3] = Math::float3(0.5f, 0.5f, -1.0f);

glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

unsigned int indices[] = {
               0, 1, 2,
               2, 3, 0
            };

glGenBuffers(1, &IBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, false, sizeof(Math::float3), 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

glDisableVertexAttribArray(0);
渲染:

Math::float3 vertices[4];
vertices[0] = Math::float3(-0.5f, 0.5f, -1.0f);
vertices[1] = Math::float3(-0.5f, -0.5f, -1.0f);
vertices[2] = Math::float3(0.5f, -0.5f, -1.0f);
vertices[3] = Math::float3(0.5f, 0.5f, -1.0f);

glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

unsigned int indices[] = {
               0, 1, 2,
               2, 3, 0
            };

glGenBuffers(1, &IBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, false, sizeof(Math::float3), 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

glDisableVertexAttribArray(0);
它呈现了一个完美的正方形四边形

我继续添加了一个顶点着色器程序:

顶点着色器

layout (location = 0) in vec3 Position;

void main(){
    gl_Position = vec4(Position.x, Position.y, Position.z, 1.0);
}
out vec4 FragColor;

void main()
{
   FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
#version 330

layout (location = 0) in vec3 Position;

uniform mat4 MVP;

void main()
{
  gl_Position = MVP * vec4(Position.x, Position.y, Position.z, 1.0);
}
MVP = glGetUniformLocation(sl->GetShaderProgram(), "MVP");

float m[16];

f -= 0.01f;

m[0] = 1.0f;
m[1] = 0.0f;
m[2] = 0.0f;
m[3] = 0.0f;

m[4] = 0.0f;
m[5] = 1.0f;
m[6] = 0.0f;
m[7] = 0.0f;

m[8] = 0.0f;
m[9] = 0.0f;
m[10] = 1.0f;
m[11] = 0.0f;

m[12] = 0.0f;
m[13] = 0.0f;
m[14] = 0.0f;
m[15] = 1.0f;

glUniformMatrix4fv(MVP, 1, GL_TRUE, m);

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

glDisableVertexAttribArray(0);
片段着色器

layout (location = 0) in vec3 Position;

void main(){
    gl_Position = vec4(Position.x, Position.y, Position.z, 1.0);
}
out vec4 FragColor;

void main()
{
   FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
#version 330

layout (location = 0) in vec3 Position;

uniform mat4 MVP;

void main()
{
  gl_Position = MVP * vec4(Position.x, Position.y, Position.z, 1.0);
}
MVP = glGetUniformLocation(sl->GetShaderProgram(), "MVP");

float m[16];

f -= 0.01f;

m[0] = 1.0f;
m[1] = 0.0f;
m[2] = 0.0f;
m[3] = 0.0f;

m[4] = 0.0f;
m[5] = 1.0f;
m[6] = 0.0f;
m[7] = 0.0f;

m[8] = 0.0f;
m[9] = 0.0f;
m[10] = 1.0f;
m[11] = 0.0f;

m[12] = 0.0f;
m[13] = 0.0f;
m[14] = 0.0f;
m[15] = 1.0f;

glUniformMatrix4fv(MVP, 1, GL_TRUE, m);

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

glDisableVertexAttribArray(0);
如果我再次运行我的程序,四边形似乎在x轴上拉伸到其大小的两倍,在Y轴上稍微拉伸

不带着色器

使用着色器

你知道这是什么原因吗?如果您需要更多代码片段或其他信息,请告诉我:)

更新

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(0, 0);
glutInitWindowSize(SCREEN_WIDTH, SCREEN_HEIGHT);
glutCreateWindow(TITLE);
Math::float3 vertices[4];
vertices[0] = Math::float3(-0.5, -0.5f, -1.0f);
vertices[1] = Math::float3(0.5f, -0.5f, -1.0f);
vertices[2] = Math::float3(0.5f, 0.5f, -1.0f);
vertices[3] = Math::float3(-0.5f, 0.5f, -1.0f);

glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices,      GL_STATIC_DRAW);

unsigned int indices[] = { 0, 1, 2, 2, 3, 0 };

glGenBuffers(1, &IBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

sl = new Loader::ShaderLoader();
sl->Initialize();
sl->AddShader("data/shaders/shader.vs", VERTEX_SHADER);
sl->AddShader("data/shaders/shader.fs", FRAGMENT_SHADER);

sl->CompileShaders();   
一些额外的代码

打开窗口/重塑形状

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(0, 0);
glutInitWindowSize(SCREEN_WIDTH, SCREEN_HEIGHT);
glutCreateWindow(TITLE);
Math::float3 vertices[4];
vertices[0] = Math::float3(-0.5, -0.5f, -1.0f);
vertices[1] = Math::float3(0.5f, -0.5f, -1.0f);
vertices[2] = Math::float3(0.5f, 0.5f, -1.0f);
vertices[3] = Math::float3(-0.5f, 0.5f, -1.0f);

glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices,      GL_STATIC_DRAW);

unsigned int indices[] = { 0, 1, 2, 2, 3, 0 };

glGenBuffers(1, &IBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

sl = new Loader::ShaderLoader();
sl->Initialize();
sl->AddShader("data/shaders/shader.vs", VERTEX_SHADER);
sl->AddShader("data/shaders/shader.fs", FRAGMENT_SHADER);

sl->CompileShaders();   

更新2

遗憾的是,我的问题仍然存在,这里有一些额外的信息:

我的地学:

Math::float3 vertices[4];
vertices[0] = Math::float3(-0.5, -0.5f, -1.0f);
vertices[1] = Math::float3(0.5f, -0.5f, -1.0f);
vertices[2] = Math::float3(0.5f, 0.5f, -1.0f);
vertices[3] = Math::float3(-0.5f, 0.5f, -1.0f);

unsigned int indices[] = { 0, 1, 2, 2, 3, 0 };
我的顶点着色器

layout (location = 0) in vec3 Position;

void main(){
    gl_Position = vec4(Position.x, Position.y, Position.z, 1.0);
}
out vec4 FragColor;

void main()
{
   FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
#version 330

layout (location = 0) in vec3 Position;

uniform mat4 MVP;

void main()
{
  gl_Position = MVP * vec4(Position.x, Position.y, Position.z, 1.0);
}
MVP = glGetUniformLocation(sl->GetShaderProgram(), "MVP");

float m[16];

f -= 0.01f;

m[0] = 1.0f;
m[1] = 0.0f;
m[2] = 0.0f;
m[3] = 0.0f;

m[4] = 0.0f;
m[5] = 1.0f;
m[6] = 0.0f;
m[7] = 0.0f;

m[8] = 0.0f;
m[9] = 0.0f;
m[10] = 1.0f;
m[11] = 0.0f;

m[12] = 0.0f;
m[13] = 0.0f;
m[14] = 0.0f;
m[15] = 1.0f;

glUniformMatrix4fv(MVP, 1, GL_TRUE, m);

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

glDisableVertexAttribArray(0);
设置视图

#define SCREEN_WIDTH 800
#define SCREEN_HEIGHT 600

#define FOV 60.0f
#define RATIO 1.0f * SCREEN_WIDTH / SCREEN_HEIGHT
#define ZNEAR 1.0f
#define ZFAR 1000.0f

if(_h == 0) _h = 1;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, _w, _h);
gluPerspective(FOV, RATIO, ZNEAR, ZFAR);
glMatrixMode(GL_MODELVIEW);
初始化

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(0, 0);
glutInitWindowSize(SCREEN_WIDTH, SCREEN_HEIGHT);
glutCreateWindow(TITLE);
Math::float3 vertices[4];
vertices[0] = Math::float3(-0.5, -0.5f, -1.0f);
vertices[1] = Math::float3(0.5f, -0.5f, -1.0f);
vertices[2] = Math::float3(0.5f, 0.5f, -1.0f);
vertices[3] = Math::float3(-0.5f, 0.5f, -1.0f);

glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices,      GL_STATIC_DRAW);

unsigned int indices[] = { 0, 1, 2, 2, 3, 0 };

glGenBuffers(1, &IBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);

sl = new Loader::ShaderLoader();
sl->Initialize();
sl->AddShader("data/shaders/shader.vs", VERTEX_SHADER);
sl->AddShader("data/shaders/shader.fs", FRAGMENT_SHADER);

sl->CompileShaders();   
渲染

layout (location = 0) in vec3 Position;

void main(){
    gl_Position = vec4(Position.x, Position.y, Position.z, 1.0);
}
out vec4 FragColor;

void main()
{
   FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
#version 330

layout (location = 0) in vec3 Position;

uniform mat4 MVP;

void main()
{
  gl_Position = MVP * vec4(Position.x, Position.y, Position.z, 1.0);
}
MVP = glGetUniformLocation(sl->GetShaderProgram(), "MVP");

float m[16];

f -= 0.01f;

m[0] = 1.0f;
m[1] = 0.0f;
m[2] = 0.0f;
m[3] = 0.0f;

m[4] = 0.0f;
m[5] = 1.0f;
m[6] = 0.0f;
m[7] = 0.0f;

m[8] = 0.0f;
m[9] = 0.0f;
m[10] = 1.0f;
m[11] = 0.0f;

m[12] = 0.0f;
m[13] = 0.0f;
m[14] = 0.0f;
m[15] = 1.0f;

glUniformMatrix4fv(MVP, 1, GL_TRUE, m);

glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

glDisableVertexAttribArray(0);
我还打印了每个渲染调用的MVP值,出于某种原因,它始终为0


同样,欢迎您提供更多提示,谢谢

最有可能的情况是,使用固定函数设置了非标识转换链(非标识投影和/或modelview矩阵)。使用着色器时,不使用固定函数矩阵,这可能解释了差异。

这是由于OpenGL中对PVM(投影视图模型)矩阵的不同方法造成的。在固定管道中,该矩阵由函数glMatrixMode定义

使用着色器时,这些矩阵通常作为统一矩阵发送到顶点着色器,并在此处进行处理

然后,顶点着色器将如下所示:

in vec3 Position;
uniform mat4 Projection;
uniform mat4 View;
uniform mat4 Model;

void main(){
    gl_Position = Projection * View * Model * vec4(Position.x, Position.y, Position.z, 1.0);
}

这应该提供关于这三个矩阵的更多信息:

我没有看到初始化视口的代码(
glViewport
call)-你能再次检查它是否正确初始化为窗口尺寸吗?用我的初始化代码更新了我的帖子:)添加了另一个关于我如何设置geomatry和FOVAh的更新是的,当然有意义。我会调查的。非常感谢。特别是对于你们的问题,你们至少需要投影矩阵,它可以根据窗口的大小使物体变形。谢谢你们,这看起来非常有用!我的顶点着色器中确实缺少此部分。我一有机会就会调查:)我现在试着用一个单位矩阵,甚至它也被拉伸了:/是的,因为你用的是单位矩阵。这意味着没有以任何方式修改向量。如果你尝试乘以它,你会发现没有修改。在我发布的那个教程中,写了一些关于投影矩阵的内容。在2D后面有数学,你可以使用正交法,这在页面下方有描述。