我在 WSL Ubuntu 上使用 g++。我使用 git 克隆了 GLFW 存储库,使用ccmake命令来配置和生成二进制文件,然后make在“build”目录中使用以最终创建文件.a。我安装了所有与 OpenGL 相关的库/usr/ld(我不记得到底安装了哪些库,因为我必须安装这么多。无论如何,g++ 命令有效,所以我认为它是成功的)。后来我在VS Code上做了一个项目,如下所示:
GLFW 包含文件夹来自上述克隆的存储库,GLAD 和 KHR 包含文件夹来自glad.dav1d.de,我将 GL 版本(在 API 下)设置为3.3,将 Profile 设置为Core。
在 中main.cpp,我放置了一段用于初始化 GLFW 的简单代码片段:
#include <iostream>
#include <glad/glad.h>
#include <GLFW/glfw3.h>
int main()
{
// Initialize GLFW
if (!glfwInit()) {
std::cerr << "Failed to initialize GLFW" << std::endl;
return 1;
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
std::cout << "Success" << …Run Code Online (Sandbox Code Playgroud) 我正在使用 GLFW 制作图形应用程序。而且......我需要以某种特定的方式处理 GLFW 回调。例如,处理帧缓冲区大小回调。我需要将此事件路由到我的应用程序类:
class OglApplication
{
/* Rest is ommited. */
public:
void Init();
void Render();
void OnResize(int width, int height);
void OnDestroy();
};
Run Code Online (Sandbox Code Playgroud)
OglApplication app;
Run Code Online (Sandbox Code Playgroud)
glfwSetFramebufferSizeCallback函数接受具有以下签名的函数 ptr:
void framebuffer_onSizeChanged(GLFWwindow* window, int width, int height);
Run Code Online (Sandbox Code Playgroud)
所以我需要创建一个中间函数来适应它void OnResize(int width, int height);。无论如何,我不能直接传递它,因为glfwSetFramebufferSizeCallback只接受静态函数(错过 C# delegates )。
那么...我尝试了什么?我尝试使用全局变量,但我知道这被认为是不好的做法。
我可以使用全局映射(键 = GLFWwindow,值 = OglApplication)并通过其关联的 GLFWwindow 获取 OglApplication。但实际上在我的应用程序中我只有一个窗口和一个 OglApplication 实例。所以我可以写一个全局指针:
static OglApplication* app;
Run Code Online (Sandbox Code Playgroud)
并在回调中使用它。我什至将其声明为静态,因此只能在当前翻译单元中访问它,因此其他代码不会违反状态(反对全局变量的参数之一)。还很糟糕吗?
我也尝试过编写 lambda 表达式。这有效:
glfwSetFramebufferSizeCallback(mainWindow, [](GLFWwindow* window, int width, int height)
{
});
Run Code Online (Sandbox Code Playgroud)
但是我需要在那里使用 OglApplication (这是局部变量)。和这个: …
我正在尝试构建一个应用程序来模拟一些基本的球体移动.
我面临的问题是,当我真正需要时,它看起来不像是在init语句之外的数组中分配数据.这与我声明包含粒子的数组的方式有关.
我想创建一个结构数组,可以从各种方法访问,所以在我的文件顶部下面我使用的include语句:
struct particle particles[];
// Particle types
enum TYPES { PHOTON, NEUTRINO };
// Represents a 3D point
struct vertex3f
{
float x;
float y;
float z;
};
// Represents a particle
struct particle
{
enum TYPES type;
float radius;
struct vertex3f location;
};
Run Code Online (Sandbox Code Playgroud)
我有一个初始化方法,它创建数组并为其分配粒子
void init(void)
{
// Create a GLU quadrics object
quadric = gluNewQuadric();
struct particle particles[max_particles];
float xm = (width / 2) * -1;
float xp = width / 2;
float ym = (height …Run Code Online (Sandbox Code Playgroud) 我想使用OpenGL库GLFW来渲染窗口,但也希望使用WinAPi来创建控件和处理事件.有没有办法做到这一点?我尝试搜索(谷歌搜索)"使用glfw和winapi",但没有产生任何结果.我找到的唯一一个我想做的就是这个,但由于GLFW_WINPAR不存在,页面似乎已经过时了.有什么方法可以做我想要的,或者我必须使用"Vanilla"OpenGL.
好像我不能编译我的GLSL着色器.偶尔(主要是在编辑文件之后),编译时出现以下错误:
----- SRC ----- (150 B)
#version 330 core
uniform mat4 mvpMatrix;
in vec4 vertexPosition_modelspace;
void main() {
gl_Position = mvpMatrix * vertexPosition_modelspace;
}
gp!
----- END -----
SimpleTransform.vertexshader:Vertex shader failed to compile with the following errors:
ERROR: 0:10: error(#132) Syntax error: 'gp' parse error
ERROR: error(#273) 1 compilation errors. No code generated
Run Code Online (Sandbox Code Playgroud)
这很奇怪,因为我发誓该文件不包含那个尴尬的gp!部分.不过我用猫调查过它
#version 330 core
uniform mat4 mvpMatrix;
in vec4 vertexPosition_modelspace;
void main() {
gl_Position = mvpMatrix * vertexPosition_modelspace;
}
Run Code Online (Sandbox Code Playgroud)
而且更少 …
我正在尝试将一些OpenGL 3.2代码从Windows移植到OS/X 10.8(使用GLFW核心配置文件),但在调用glDrawElements时获取INVALID_OPERATION(glError()).glDrawArrays函数工作正常,因此我的着色器初始化正常.
以下片段很好地解释了我在做什么.我知道自己做错了什么?
struct Vertex {
vec2 position;
vec3 color;
};
void display() {
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shaderProgram);
mat4 projection = Ortho2D(-15.0f, 15.0f, -15.0f, 15.0f);
glUniformMatrix4fv(projectionUniform, 1, GL_TRUE, projection);
glBindVertexArray(shapeVertexArrayBuffer);
mat4 modelView;
// upper left
modelView = Translate(-7,+7,0);
glUniformMatrix4fv(modelViewUniform, 1, GL_TRUE, modelView);
glDrawArrays(GL_TRIANGLE_FAN, 0, rectangleSize); // renders correctly
// upper right
modelView = Translate(+7,+7,0);
glUniformMatrix4fv(modelViewUniform, 1, GL_TRUE, modelView);
GLuint indices[6] = {0,1,2,3,4,0};
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, indices); //INVALID_OPERATION
glfwSwapBuffers();
}
void loadGeometry() {
vec3 color(1.0f, 1.0f, 0.0f);
Vertex …Run Code Online (Sandbox Code Playgroud) 所以基本上我有兴趣知道我需要知道哪个Windows api才能在Windows中用鼠标选择文件并将其拖放到我的应用程序窗口中
我的应用程序窗口将由GLFW处理,它基本上处理图像格式,但这并不重要
我有兴趣了解的是如何在Windows中执行此操作
基本上我有一个想法,我必须引用Windows API,并利用他们的一些功能/方法,并通过一些管道将文件从Windows应用程序移植到我的应用程序
因此,如果您可以指导我使用正确的API和简要的方法/想法如何做到这一点以及如何工作
谢谢
因此,我最近刚从LWJGL 2升级到3,并且在获取键盘和鼠标输入时遇到了一些困难。顺便说一下,我正在使用它进行相机的移动和旋转。
我的问题是,如果我使用GLFW回调,则移动似乎非常不稳定且缓慢。这不是一个稳定的速度,只是感觉不对。此外,当我按下一个键(例如w)向前移动时,从GLFW_PRESS到的转换之间大约有半秒的延迟。GLFW_REPEAT这会导致在按下键时相机在前半秒内不会移动。
顺便说一下,我有一个InputHandler类,该类具有用于keyDown,keyPressed,keyReleased等的方法。在一个invoke方法中,我没有所有的键检查。invoke方法将键事件添加到存储键的列表中,以及事件状态枚举,该枚举可以是DOWN,TAPPED,RELEASED,NONE之一。上课很大程度上是基于对这个问题的回答
我花了过去2个小时的时间来寻找解决方案,但没有发现太多。我确实找到了一些使用回调方法的替代方法,例如:
if (glfwGetKey(window, key) == GLFW_PRESS)
Run Code Online (Sandbox Code Playgroud)
和
if (glfwGetKey(windowm key) == GLFW_RELEASE)
Run Code Online (Sandbox Code Playgroud)
但是我找不到一种方法来检测单个按键,即GLFW_REPEAT状态,因为该glfwGetKey方法只能检测GLFW_PRESS和GLFW_RELEASE。
如果有人可以告诉我一种方法来检测单个按键敲击glfwGetKey,或者使GLFW回调更轻松,更流畅,我将不胜感激。
谢谢 :)
我一直试图将这个问题弄清楚很长时间,但无法让事情发挥作用.我只想编译/运行我的OpenGL程序,但我的着色器没有正确链接,我没有得到任何有用的错误消息.在一种情况下,错误纯粹是空的,而在另一种情况下,它是??y?出于某种原因.
要创建我的程序并编译我的着色器,我有以下代码:
GLuint buildProgram(const char* vertexShaderFile, const char* fragmentShaderFile)
{
std::string vs = fileContents(vertexShaderFile);
std::string fs = fileContents(fragmentShaderFile);
return createProgram(vs.c_str(), fs.c_str());
}
Run Code Online (Sandbox Code Playgroud)
着色器看起来像
#version 330
out vec4 out_color;
void main()
{
out_color = vec4(0.5, 0.5, 0.5, 0.5);
}
#version 330
in vec4 in_Position;
void main()
{
gl_Position = in_Position;
}
Run Code Online (Sandbox Code Playgroud)
同
GLuint createProgram(const char* vertexSource, const char* fragmentSource)
{
GLuint vertexshader = createShader(vertexSource, GL_VERTEX_SHADER);
GLuint fragmentshader = createShader(fragmentSource, GL_FRAGMENT_SHADER);
GLuint program = glCreateProgram();
glAttachShader(program, vertexshader);
glAttachShader(program, fragmentshader);
glLinkProgram(program); …Run Code Online (Sandbox Code Playgroud) 我试图用openGL GLFW库在窗口上绘制一个三角形.这是我的完整代码
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
using namespace std;
static unsigned int compileShader ( unsigned int type, const string& source ){
unsigned int id = glCreateShader ( type );
const char* src = source.c_str();
glShaderSource ( id, 1, &src, nullptr );
glCompileShader ( id );
int result = 0;
glGetShaderiv ( id, GL_COMPILE_STATUS, &result );
if ( result == GL_FALSE ){
int length = 0;
glGetShaderiv ( id, GL_INFO_LOG_LENGTH, &length );
char* message = ( char* ) alloca …Run Code Online (Sandbox Code Playgroud)