为什么我的 GLSL 转换没有渲染
Why is my GLSL transformation not rendering?
所以我正在学习OpenGL和GLSL(显然)。我已经虔诚地遵循了几个关于矩阵转换的教程,但我无法弄清楚为什么正方形没有渲染。通过反复试验,我已经发现我的渲染代码很好,只是当我在顶点着色器中进行"转换 * vec4(...)"时,程序就会搞砸。我检查了glGetUniformLocation的返回值,我得到了一个返回值0,所以它得到了制服的位置。我环顾四周,没有找到解决方案。
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
#define GLEW_STATIC
#include <glew.h>
#include <SDL.h>
#include <math.h>
#include <glm/glm.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <glm/gtc/matrix_transform.hpp>
const GLchar* VertShaderCode = "
#version 330 coren
layout (location = 0) in vec2 position;n
uniform mat4 transformation;n
void main ()n
{n
vec4 lol = transformation * vec4(position.xy, 0, 1);n
gl_Position = lol;n
}n
";
const GLchar* FragShaderCode = "
#version 330 coren
void main ()n
{n
gl_FragColor = vec4(1, 0, 1, 1);n
}n
";
#define SDL_main main
#define scuffed !SDL_QuitRequested()
int main()
{
if (SDL_Init(SDL_INIT_EVERYTHING))
{
printf("Could not initialize SDL!n");
return -4;
};
SDL_Window* window = SDL_CreateWindow("Testing Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 420, 420, SDL_WINDOW_OPENGL);
if (!window)
{
printf("Could not create window!n");
return -5;
};
SDL_GLContext context = SDL_GL_CreateContext(window);
if (!context)
{
printf("Could not create context!n");
return -7;
};
if (glewInit() != GLEW_OK)
{
printf("Could not initialize GLEW!n");
return -6;
};
GLint err;
char* log = NULL;
//printf("Vertex Shader Source: n%sn",VertShaderCode);
GLuint VertShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(VertShader,1,&VertShaderCode,NULL);
glCompileShader(VertShader);
glGetShaderiv(VertShader,GL_COMPILE_STATUS,&err);
if (err == GL_FALSE)
{
// Shader didn't compile.
glGetShaderiv(VertShader, GL_INFO_LOG_LENGTH, &err);
log = (char*)malloc(err);
glGetShaderInfoLog(VertShader,err,NULL,log);
printf("Vertex shader could not be compiled!nn%snn",log);
return -1;
};
//printf("Fragment Shader Source: n%sn", FragShaderCode);
GLuint FragShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(FragShader, 1, &FragShaderCode, NULL);
glCompileShader(FragShader);
glGetShaderiv(FragShader, GL_COMPILE_STATUS, &err);
if (err == GL_FALSE)
{
// Shader didn't compile.
glGetShaderiv(FragShader, GL_INFO_LOG_LENGTH, &err);
log = (char*)malloc(err);
glGetShaderInfoLog(FragShader, err, NULL, log);
printf("Fragment shader could not be compiled!nn%snn", log);
return -2;
};
GLuint Program = glCreateProgram();
glAttachShader(Program,VertShader);
glAttachShader(Program,FragShader);
glLinkProgram(Program);
glGetProgramiv(Program,GL_LINK_STATUS,&err);
if (err == GL_FALSE)
{
// Program didn't link.
glGetProgramiv(Program,GL_INFO_LOG_LENGTH,&err);
log = (char*)malloc(err);
glGetProgramInfoLog(Program,err,NULL,log);
printf("Program could not be linked!nn%snn",log);
return -3;
};
glUseProgram(Program);
GLuint vertBuff = 0, arrayBuff = 0, elementBuff = 0;
glGenVertexArrays(1, &arrayBuff);
glGenBuffers(1, &vertBuff);
glGenBuffers(1, &elementBuff);
glBindVertexArray(arrayBuff);
glBindBuffer(GL_ARRAY_BUFFER, vertBuff);
//glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, elementBuff);
GLfloat vertices[] =
{
-0.5, 0.5,
-0.5, -0.5,
0.5, -0.5,
0.5, -0.5,
-0.5, 0.5,
0.5, 0.5,
};
GLubyte colors[] =
{
255,0,0,
0,255,0,
0,0,255
};
GLuint indicies[] =
{
0, 1, 2,
2, 0, 3,
};
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glm::mat4 mat = glm::scale(mat, glm::vec3(2, .5, 0));
glUniformMatrix4fv(glGetUniformLocation(Program, "transformation"), 1, GL_FALSE, glm::value_ptr(mat));
while (scuffed)
{
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 6);
SDL_GL_SwapWindow(window);
}
glDeleteVertexArrays(1, &arrayBuff);
glDeleteBuffers(1, &vertBuff);
//glDeleteBuffers(1, &elementBuff);
SDL_GL_DeleteContext(context);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
问题不在于着色器中的代码,而在于您传递给transformation
的数据:
glm::mat4 mat = glm::scale(mat, glm::vec3(2, .5, 0));
glm::scale function
将新的缩放函数乘以传入mat
。问题是,当您将mat
传递给scale
时,它不会初始化,并且只包含一些随机垃圾。您真正想要的是首先初始化矩阵(作为单位矩阵,但这是默认行为),然后将其传递给 scale:
glm::mat4 mat;
mat = glm::scale(mat, glm::vec3(2, .5, 0));
请注意,这两个版本在 c++ 中并不等效,因为第一个版本在将 mat
传递给函数之前不会调用构造函数。
相关文章:
- 为什么我的模板化函数需要从一个迭代器转换到另一个迭代器?
- 我需要帮助将我的代码从 c++ 转换为 java
- 错误:从"int"到"int*"的转换无效[-允许].我在下面提供了我的代码,我
- 为什么我的编译器无法弄清楚这种转换,它何时存在?
- 我的程序将 26 个字母转换为 ascII 没有显示正确答案
- 如何将我的小程序转换为用于项目的函数?
- 为什么我的编译器在调用 const getter 函数时抛出"转换丢失(const)限定符"错误?
- 如何将我的每个矢量字符串转换为纪元时间日期
- 如何将我的类转换为命名空间
- 为什么我的C++基转换器中出现分段错误?
- 我把我的编译器从32位转换为64位,但我仍然不能使用超过2GB:(为什么
- 我需要静态转换我的数字模板值吗
- 如何将我的程序转换为.dll文件并使用rundll32.exe在cmd中运行它?
- 我的代码在作为参数传入 .begin() 时不起作用,但在我将 .begin() 转换为迭代器后工作
- 为什么我的C++程序输出不同的数字来将米转换为英尺?
- 为什么我的代码无法将字符串正确转换为 int 数组?
- 在我的 nucleo-L432KC 上设置时钟,使用 DMA 进行 5 通道 ADC 转换
- 为什么当我在MD5 Hash中转换相同的C 字符串时,每次都会获得不同的输出
- 我的lambda在复制构建期间没有正确转换捕获的"this"
- MultiByteToWideChar不能很好地转换我的字符串