绘制三角形不起作用:我只看到黑屏和鼠标
Drawing triangle doesn't work: I just see a black screen and my mouse
我对现代OpenGL函数使用glw,对窗口使用GLFW。我试着画一个三角形,但有问题,它编译和运行,但没有画出三角形,我只看到一个黑屏和我的鼠标。下面是我的代码:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <glew.h>
#include <GLFWglfw3.h>
#include <glmglm.hpp>
const GLchar* vertexSource =
"#version 150 coren"
"in ver2 position;"
"void main(){"
" gl_Position = vec4(position, 0.0, 1.0);"
"}";
const GLchar* fragmentSource =
"#version 150 coren"
"out vec4 outColor;"
"void main(){"
" outColor = vec4(1.0, 1.0, 1.0, 1.0);"
"}";
int main(){
//GLFW init:
if (!glfwInit()){
fprintf(stderr, "Failed to init GLFW");
glfwTerminate();
}
//Hints:
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
//Creating window:
GLFWwindow* window = glfwCreateWindow(800, 600, "Engine", glfwGetPrimaryMonitor(), nullptr);
glfwMakeContextCurrent(window);
//Glew initialize:
glewExperimental = GL_TRUE;
glewInit();
//Create vertex array object:
GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
//Create vertex buffer object:
GLuint vbo;
glGenBuffers(1, &vbo);
//Our triangle data:
GLfloat vertices[] = {
0.0f, 0.5f, //Vertex 1 (X, Y)
0.5f, -0.5f, //Vertex 2 (X, Y)
-0.5f, -0.5f //Vertex 3 (X, Y)
};
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
//Create and compile the vertex shader:
GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader, 1, &vertexSource, NULL);
glCompileShader(vertexShader);
//Create and compile the fragment shader:
GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader, 1, &fragmentSource, NULL);
glCompileShader(fragmentShader);
//Creating shaders program:
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glBindFragDataLocation(shaderProgram, 0, "outColor");
glLinkProgram(shaderProgram);
glUseProgram(shaderProgram);
GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
glEnableVertexAttribArray(posAttrib);
glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0);
//The loop:
while (!glfwWindowShouldClose(window)){
//Escape key:
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS){
glfwSetWindowShouldClose(window, GL_TRUE);
}
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
glfwSwapBuffers(window);
glfwPollEvents();
}
return 0;
}
"in ver2 position;"
^^^^
什么是ver2
?我怀疑你的GLSL编译器也知道。
尝试vec2
并检查您的着色器编译/链接状态/日志:
struct Program
{
static GLuint Load( const char* vert, const char* geom, const char* frag )
{
GLuint prog = glCreateProgram();
if( vert ) AttachShader( prog, GL_VERTEX_SHADER, vert );
if( geom ) AttachShader( prog, GL_GEOMETRY_SHADER, geom );
if( frag ) AttachShader( prog, GL_FRAGMENT_SHADER, frag );
glLinkProgram( prog );
CheckStatus( prog );
return prog;
}
private:
static void CheckStatus( GLuint obj )
{
GLint status = GL_FALSE;
if( glIsShader(obj) ) glGetShaderiv( obj, GL_COMPILE_STATUS, &status );
if( glIsProgram(obj) ) glGetProgramiv( obj, GL_LINK_STATUS, &status );
if( status == GL_TRUE ) return;
GLchar log[ 1 << 15 ] = { 0 };
if( glIsShader(obj) ) glGetShaderInfoLog( obj, sizeof(log), NULL, log );
if( glIsProgram(obj) ) glGetProgramInfoLog( obj, sizeof(log), NULL, log );
std::cerr << log << std::endl;
exit( -1 );
}
static void AttachShader( GLuint program, GLenum type, const char* src )
{
GLuint shader = glCreateShader( type );
glShaderSource( shader, 1, &src, NULL );
glCompileShader( shader );
CheckStatus( shader );
glAttachShader( program, shader );
glDeleteShader( shader );
}
};
你不需要使用glBindFragDataLocation
,而是写gl_FragColor
在片段着色器:
const GLchar* fragmentSource =
"#version 150 coren"
"void main(){"
" gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);"
"}";
否则,您需要使用glDrawBuffers
相关文章:
- 绘制旋转的三角形
- WinAPI挂钩鼠标
- 如何用for循环在c++中生成单词三角形
- 将鼠标悬停在问题上时与预期">"相关的代码错误
- 跟踪滚动条上的鼠标事件
- 如何使用递归打印修改后的星号三角形图案
- SendInput()鼠标移动计算
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- C++ 创建带有 for 循环的三角形
- 绘制顺时针三角形,重新排序点
- 如何在鼠标挂钩过程中检测拖动
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- Eigen c++ 三角形来自
- 为我的 c++ 类介绍制作一个三角形分类器.我有几个问题
- 使用对象文件读取三角形数据网格
- Win32 发送输入鼠标移动滞后并冻结
- 将鼠标和键盘输入发送到 unity3d 游戏 (Rust)
- 从捕获的帧中裁剪三角形 - OpenCV 和 C++
- 有没有办法区分Qt小部件是通过鼠标单击还是通过按表键获得焦点?
- 绘制三角形不起作用:我只看到黑屏和鼠标