【发布时间】:2018-07-12 14:07:28
【问题描述】:
我正在尝试用 OpenGL 绘制一个三角形。
我的代码编译得很好,没有产生任何错误,但它仍然没有做它应该做的。
我有一个顶点着色器和一个片段着色器,它们都在同一个程序中。
我的代码如下:
#include "../../include/sb7.h"
GLuint compile_shaders(void)
{
GLuint vertex_shader;
GLuint fragment_shader;
GLuint program;
// Source code for Vertex Shader
static const GLchar * vertex_shader_source[] =
{
"#version 450 core \n"
" \n"
"void main(void) \n"
"{ \n"
" //Decalre a hardcoded array of positions \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"
" //Index into our array using gl_VertexID \n"
" gl_Position = vertices[gl_VertexID]; \n"
"} \n"
};
// Source code for Fragment Shader
static const GLchar * fragment_shader_source[] =
{
"#version 450 core \n"
" \n"
"out vec4 color; \n"
" \n"
"void main(void) \n"
"{ \n"
" color = vec4(0.0, 0.8, 1.0, 1.0); \n"
"} \n"
};
// Create and compiler Vertex Shader
vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_shader, 1, vertex_shader_source, NULL);
glCompileShader(vertex_shader);
// Create and compiler Fragment Shader
fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment_shader, 1, fragment_shader_source, NULL);
glCompileShader(fragment_shader);
// Create program, attach shaders to it, and link it
program = glCreateProgram();
glAttachShader(program, vertex_shader);
glAttachShader(program, fragment_shader);
glLinkProgram(program);
// Delete shaders as program has them now
glDeleteShader(vertex_shader);
glDeleteShader(fragment_shader);
return program;
};
class my_application : public sb7::application
{
public:
void startup()
{
rendering_program = compile_shaders();
glCreateVertexArrays(1, &vertex_array_object);
glBindVertexArray(vertex_array_object);
}
void shutdown()
{
glDeleteVertexArrays(1, &vertex_array_object);
glDeleteProgram(rendering_program);
glDeleteVertexArrays(1, &vertex_array_object);
}
// Our rendering function
void render(double currentTime)
{
// Sets Colour
static const GLfloat color[] = { 0.0f, 0.2f, 0.0f, 1.0f };
glClearBufferfv(GL_COLOR, 0, color);
// Use program object we created for rendering
glUseProgram(rendering_program);
// Draw one triangle
glDrawArrays(GL_TRIANGLES, 0, 3);
}
private:
GLuint rendering_program;
GLuint vertex_array_object;
};
我正在关注 OpenGL Superbible,第 7 版。
即使我更改了点的大小并且输出是我为此获得的相同屏幕(全黄色),相同的程序(有小的更改)也没有绘制点。
我看到在绘制三角形过程中出现类似的问题,但它们都与我正在做的不同。
我该如何解决这个问题?
【问题讨论】:
-
我看不到你在哪里覆盖
init(),它调用了所需的sb7::application::init() -
这本书没有说要覆盖
sb7::application's init().,只是说要覆盖render(), startup(), and shutdown() -
我在看
SB7dir\scr\singletri,这似乎是你的基地。它覆盖init(),以便能够设置一些细节。请参阅SB7dir\include\sb7.h在您的情况下,此函数正在设置 4.3 上下文,而您在着色器中要求 4.5。 -
GLSL 编译和链接日志说了什么? (看这里how glsl_log is obtained)我敢打赌,你的着色器源代码文本没有像应该的那样编码为 ASCII ......如果有影响,请尝试使用文件。如果是,则需要添加某种
_TEXT("bla bla bla")宏来补偿。 -
我现在也改成了4.3的上下文,但它只是显示一个黄屏