OpenGL glfw 无法使用着色器绘制点
Posted
技术标签:
【中文标题】OpenGL glfw 无法使用着色器绘制点【英文标题】:OpenGL glfw unable to draw a point using shader 【发布时间】:2020-10-10 12:42:33 【问题描述】:我使用GLFW 来创建窗口上下文。
我有一个 procs.hpp 文件,它只使用 glxGetProcAddress
加载所需的 opengl 函数(如 glCreateShader
、glCreateProgram
等)。
程序编译成功,但是当我运行它时屏幕上没有任何意义。只是粉红色的背景。
谁能指出错误?
#include <GLFW/glfw3.h>
#include <iostream>
#include <GL/glx.h>
#include <stdio.h>
#include "procs.hpp"
constexpr const GLchar * vertex_shader_source =
R"(#version 450 core
void main()
gl_Position = vec4(0.3, 0.3, 0.5, 1.0);
)";
int a= printf("%s",vertex_shader_source);
constexpr const GLchar * fragment_shader_source =
R"(#version 450 core
out vec4 out_color;
void main()
out_color= vec4(1,0,0,1);
)";
int main()
GLFWwindow* window;
GLuint vertex_shader;
GLuint fragment_shader;
GLuint program;
GLuint vertex_array_object;
/* Initialize the library */
if (!glfwInit())
std::cerr<<"Error initializing glfw";
return -1;
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(1000, 800, "Hello World", NULL, NULL);
if (!window)
glfwTerminate();
return -1;
/* Make the window's context current */
glfwMakeContextCurrent(window);
vertex_shader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_shader, 1, &vertex_shader_source, nullptr);
glCompileShader(vertex_shader);
fragment_shader = glCreateShader(GL_FRAGMENT_SHADER) ;
glShaderSource(fragment_shader,1,&fragment_shader_source,nullptr);
glCompileShader(fragment_shader);
program = glCreateProgram();
glAttachShader(program,vertex_shader);
glAttachShader(program,fragment_shader);
glLinkProgram(program);
// Delete the shaders as the program has them now
glDeleteShader(vertex_shader);
glDeleteShader(fragment_shader);
glCreateVertexArrays(1, &vertex_array_object);
glBindVertexArray(vertex_array_object);
glClearColor(1,0,1,1);
glPointSize(10.0f);
/* Loop until the user closes the window */
while (!glfwWindowShouldClose(window))
/* Render here */
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(program);
glDrawArrays(GL_POINTS, 0, 1);
/* Swap front and back buffers */
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
glDeleteProgram(program);
glfwTerminate();
return 0;
【问题讨论】:
glPointSize
在核心配置文件中无效。您必须使用兼容性配置文件。
@Rabbid76,在核心配置文件中是否可以替代glPointSize()
?
不行,你必须用三角形图元绘制圆形或矩形。
【参考方案1】:
OpenGL Context 不保证提供 10.0 的磅值 (glPointSize
)。
通过检索参数GL_POINT_SIZE_RANGE
获取点大小范围:
GLfloat pointSizeRange[2];
glGetFloatv(GL_POINT_SIZE_RANGE, pointSizeRange);
【讨论】:
谢谢!我尝试了兼容性配置文件,它按预期工作。到目前为止,我没有使用 glew 或很高兴保持简单并了解它在没有库的情况下如何工作。glxGetProcAdress()
现在就足够了。我可以知道您从哪里发现glPointSize()
在核心配置文件中不起作用?你能提供来源还是你凭经验知道的? :)
@Omkar76 来自OpenGL specification - Khronos OpenGL registry,比较OpenGL 4.6 API Core Profile Specification 和OpenGL 4.6 API Compatibility Profile Specification以上是关于OpenGL glfw 无法使用着色器绘制点的主要内容,如果未能解决你的问题,请参考以下文章