Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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着色器未绘制_C_Opengl - Fatal编程技术网

C OpenGL着色器未绘制

C 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

我目前正在使用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.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你的建议确实是正确的。但是,我声明着色器源的方式不正确。