我正在尝试使用着色器渲染一个矩形。但是当我启动程序时,OpenGL 会渲染矩形,但颜色不正确。我正在观看有关 C++ 中 OpenGL 的 youtube 教程,但我想用 C 编写代码,因此 OpenGL 命令和 GLSL 源代码应该是正确的。谁能帮我?谢谢 :
编辑:当我在函数 compileShader 中打印字符串“char *shaderSource”时,它显示字符串最后看起来有点不同:
"#version 330
layout(location = 0) out vec4 color;
void main(){
color = vec4(1.0f, 1.0f, 0.0f, 1.0f);
}
R$▒)H"
最后的这个字符每次都不同
主程序
#define APIENTRY __stdcall
#include<glad/glad.h>
#include <GL/glut.h>
#include <stdio.h>
#include "VertexBuffer.h"
//#include"shader.h"
#include"shader2.h"
struct VertexBuffer buffer1;
void display(void)
{
glClearColor(0,1.0,1.0,0);
glClear(GL_COLOR_BUFFER_BIT); //Löscht Bild aus Speicher
bindVertexBuffer(&buffer1);
glDrawArrays(GL_TRIANGLES,0, 3); //Modus, start, anzahl
unbindVertexBuffer();
glFlush(); //Gibt dem Bildschirm das Bild
}
void keyboard(unsigned char key, int x, int y)
{
if(key == 27) //Wenn Escape schließen
{
exit(0);
}
}
void reshape(int width, int height)
{
}
int main (int argc, char **argv)
{
glutInit(&argc, argv);
glutInitWindowSize(500, 500);
glutInitWindowPosition(183,100);
glutCreateWindow("TestApp");
glutDisplayFunc(display); //display func initialisieren
glutKeyboardFunc(keyboard); //keyboard func initialisieren
glutReshapeFunc(reshape); //reshape func initialisieren
gladLoadGL();
//Initialize the triangle-------------------------
struct Vertex verticies[3];
verticies[0].x = -0.5;
verticies[0].y = -0.5;
verticies[0].z = 0;
verticies[1].x = 0;
verticies[1].y = 0.5;
verticies[1].z = 0;
verticies[2].x = 0.5;
verticies[2].y = -0.5;
verticies[2].z = 0;
uint32_t numVerticies = 3;
//-------------------------------------------------
buffer1.data = verticies; //Daten an Buffer übergeben
buffer1.numVerticies = numVerticies; //Anzahl verticies an Buffer übergeben
initVertexBuffer(&buffer1); //Buffer initialisieren, mit Adresse des Buffers
struct Shader shader1;
shader1.vertexShader = "#version 330 core layout(location = 0) in vec3 position; void main(){ gl_Position = vec4(position, 1.0f);}";
shader1.fragmentShader = "#version 330 core layout(location = 0) in vec3 position; void main(){gl_Position = vec4(position, 1.0f);}";
initShader(&shader1);
bindShader(&shader1);
//LOOP starts
glutMainLoop();
return 0;
}
着色器2.h
#include<glad/glad.h>
#include<stdio.h>
struct Shader
{
//Parameter
const char *vertexShader;
const char *fragmentShader;
GLuint shaderId;
};
GLuint createShader();
GLuint compileShader();
void initShader(struct Shader *shader)
{
(*shader).shaderId = createShader((*shader), (*shader).vertexShader, (*shader).fragmentShader);
}
void bindShader(struct Shader *shader)
{
glUseProgram((*shader).shaderId);
}
void unBindShader(struct Shader *shader)
{
glUseProgram(0);
}
GLuint createShader(struct Shader *shader, const char *vertexShader, const char *fragmentShader)
{
GLuint program = glCreateProgram();
GLuint vs = compileShader(vertexShader, GL_VERTEX_SHADER);
GLuint fs = compileShader(fragmentShader, GL_FRAGMENT_SHADER);
glAttachShader(program, vs);
glAttachShader(program, fs);
glLinkProgram(program);
// glDetachShader(program, vs);
// glDetachShader(program, fs);
return program;
}
GLuint compileShader(char *shaderSource, GLenum type)
{
GLuint id = glCreateShader(type);
glShaderSource(id, 1, &shaderSource, 0);
glCompileShader(id);
return id;
}