C OpenGL着色器未绘制
我目前正在使用OpenGL 4.5,正在阅读OpenGL Superbible第七版。现在,我不是在使用他们提供的项目,而是在滚动我自己的项目。然而,根据我到目前为止的理解,它应该在我的屏幕上放一些东西,但我什么也没有得到 我一共有3个文件。Source.c、Loader.h和Loader.c 源代码.cC OpenGL着色器未绘制,c,opengl,C,Opengl,我目前正在使用OpenGL 4.5,正在阅读OpenGL Superbible第七版。现在,我不是在使用他们提供的项目,而是在滚动我自己的项目。然而,根据我到目前为止的理解,它应该在我的屏幕上放一些东西,但我什么也没有得到 我一共有3个文件。Source.c、Loader.h和Loader.c 源代码.c #include <stdio.h> #include <stdlib.h> #include <GL\glew.h> #include <GL\GL
#include <stdio.h>
#include <stdlib.h>
#include <GL\glew.h>
#include <GL\GL.h>
#include <GL\GLU.h>
#include <GL\wglew.h>
#include <GLFW\glfw3.h>
#include "Loader.h"
#define CL_BUFFER (GLfloat[4]) { 0.2f, 0.2f, 0.2f, 1.0f }
int main(void);
void err(int error, const char * msg);
void keypress(GLFWwindow *window, int key, int scancode, int action, int mods);
int main(void) {
if (!glfwInit())
return -1;
GLFWwindow *window = glfwCreateWindow(1024, 768, "Fididdler", NULL, NULL);
glfwWindowHint(GLFW_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_VERSION_MINOR, 5);
if (window == NULL)
return -1;
glfwSetErrorCallback(err);
glfwSetKeyCallback(window, keypress);
glfwMakeContextCurrent(window);
if (glewInit() != GLEW_OK)
return -1;
printf("GL Version String: %s \n", glGetString(GL_VERSION));
GLuint RProg = LoadAllShaders();
printf("Loading complete");
while (!glfwWindowShouldClose(window)) {
glClearBufferfv(GL_COLOR, 0, CL_BUFFER);
glUseProgram(RProg);
glDrawArrays(GL_TRIANGLES, 0, 3);
/* End drawing logic*/
glfwSwapBuffers(window);
glfwPollEvents();
}
glfwTerminate();
return 1;
}
void err(int error, const char * msg) {
printf("Error: %s", msg);
}
void keypress(GLFWwindow *window, int key, int scancode, int action, int mods) {
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) {
glfwSetWindowShouldClose(window, GLFW_TRUE);
}
}
装载机收割台:
#include <GL\glew.h>
#include <GL\GL.h>
#include <GL\GLU.h>
#pragma once
extern GLuint LoadAllShaders();
extern void LogCompileStatus(GLuint Shader, char* ShaderName);
加载程序C文件
#include "Loader.h"
#include <stdio.h>
#include <stdlib.h>
#include <GL/glew.h>
#include <GL/GL.h>
#include <GL/GLU.h>
#include <GLFW/glfw3.h>
static const GLchar* VSource[] = {
"#version 450 core\n",
"void main(void)\n",
"{\n",
// Right here is what I am expecting to be drawn, but it is not
" const vec4 vertices[3] = vec4[3](vec4(0.25, -0.25, 0.5, 1.0),",
" vec4(-0.25, -0.25, 0.5, 1.0),",
" vec4(0.25, 0.25, 0.5, 1.0));\n",
" gl_Position = vertices[gl_VertexID];\n",
"}\n"
};
static const GLchar* FSource[] = {
"#version 450 core\n",
"out vec4 color;\n",
"void main(void)\n",
"{\n",
" color = vec4(0.0, 0.8, 1.0, 1.0);\n",
"}\n"
};
GLuint LoadAllShaders() {
GLuint VShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(VShader, 1, VSource, NULL);
glCompileShader(VShader);
LogCompileStatus(VShader, "VShader");
GLuint FShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(FShader, 1, FSource, NULL);
glCompileShader(FShader);
LogCompileStatus(FShader, "FShader");
GLuint Program = glCreateProgram();
glAttachShader(Program, VShader);
glAttachShader(Program, FShader);
glLinkProgram(Program);
glDeleteShader(VShader);
glDeleteShader(FShader);
return Program;
}
void LogCompileStatus(GLuint Shader, char* ShaderName) {
// Checking compile status of VShader
if (ShaderName == NULL || sizeof(ShaderName) == 0)
ShaderName = ("Unnamed Shader with ID: %i" + (char)&Shader);
GLuint ShaderSuccess = GL_FALSE;
glGetShaderiv(Shader, GL_COMPILE_STATUS, &ShaderSuccess);
if (ShaderSuccess == GL_TRUE)
printf("Shader %s successfully compiled\n", ShaderName);
else {
GLint LogLength;
glGetShaderiv(Shader, GL_INFO_LOG_LENGTH, &LogLength);
char* buffer = (char*)malloc(LogLength);
glGetShaderInfoLog(Shader, LogLength, NULL, buffer);
printf("%s failed to compile.\n%s\n", ShaderName, buffer);
free(buffer);
}
}
据我所知,我正在做教程中需要做的一切,但我没有得到同样的结果。这是我得到的输出
我不知道为什么我声明VSource的方式是不正确的,但在教科书中重新引用该源代码表明,在GLSL源的引号末尾有逗号是导致其错误的原因 代码是
/// EOL commas broke this
static const GLchar* VSource[] = {
"#version 450 core\n",
"void main(void)\n",
"{\n",
" const vec4 vertices[3] = vec4[3](vec4(0.25, -0.25, 0.5, 1.0),",
" vec4(-0.25, -0.25, 0.5, 1.0),",
" vec4(0.25, 0.25, 0.5, 1.0));\n",
" gl_Position = vertices[gl_VertexID];\n",
"}\n"
};
static const GLchar* FSource[] = {
"#version 450 core\n"
"out vec4 color;\n"
"void main(void)\n"
"{\n"
" color = vec4(0.0, 0.8, 1.0, 1.0);\n"
"}\n"
};
代码应该是
static const GLchar* VSource[] = {
"#version 450 core\n",
"void main(void)\n",
"{\n",
" const vec4 vertices[3] = vec4[3](vec4(0.25, -0.25, 0.5, 1.0),\n",
" vec4(-0.25, -0.25, 0.5, 1.0),\n",
" vec4(0.25, 0.25, 0.5, 1.0));\n",
" gl_Position = vertices[gl_VertexID];\n",
"}\n"
};
static const GLchar* FSource[] = {
"#version 450 core\n"
"out vec4 color;\n"
"void main(void)\n"
"{\n"
" color = vec4(1.0, 1.0, 1.0, 1.0);\n"
"}\n"
};
编辑:
我刚弄明白为什么它不起作用。人眼的着色器代码是正确的,但它只读取顶点着色器的第一行,这是一个空着色器程序。GLSL编译器读取1个条目,而不是所有条目。看起来您实际上没有指定任何要绘制的内容。在绘制之前,您需要创建一个VBO,填充它,并绑定它。但这不是为什么在着色器中有vec4数组的原因吗?为了教程的缘故。我加了一条评论,我期待着被画出来。啊,现在我明白了。该着色器称为顶点着色器,因为它称为逐顶点着色器。但是,由于实际上没有指定任何顶点,因此程序不会执行任何操作。OpenGL的工作原理是将一些缓冲数据沿图形管道发送,并在此过程中应用转换。由于各种着色器只是此管道中的转换步骤,因此无法在其中完全指定数据。@BenSteffan glDrawArraysGL_三角形,0,3;绘制3个顶点。每一个都没有属性。但这并不重要,因为顶点着色器将位置从稀薄的空气中拉出来。@BenSteffan你的建议确实是正确的。但是,我声明着色器源的方式不正确。