天道酬勤,学无止境

opengl

OpenGL doesn't seem to be reading my vertices/indices

问题 我一直在学习本教程以学习 OpenGL。 我有一些有用的东西,但前提是我使用全局变量: #include <GL/glew.h> #include <GLFW/glfw3.h> #include <iostream> // float vertices[] = { // -0.5f, -0.5f, 0.0f, // 0.5f, -0.5f, 0.0f, // 0.0f, 0.5f, 0.0f // }; float rectVertices[] = { 0.5f, 0.5f, 0.0f, // Top Right 0.5f, -0.5f, 0.0f, // Bottom Right -0.5f, -0.5f, 0.0f, // Bottom Left -0.5f, 0.5f, 0.0f // Top Left }; uint rectIndices[] = { 0, 1, 3, // First Triangle 1, 2, 3 // Second Triangle }; const GLchar* vertexShaderSource = "#version 330 core\n" "layout (location = 0) in vec3 position;\n" "void main() {\n" "gl_Position = vec4(position.x

2022-07-11 09:47:42    分类:技术分享    c++   pointers   opengl

matrix rotation multiple times

问题 回答1 您不会“旋转”矩阵。 您通过乘法应用旋转变换矩阵。 是的,每次调用 OpenGL 矩阵操作函数时,结果都将用作下一次变换乘法的输入。 围绕 X 轴旋转 90° 会将 Y 轴映射到 Z 并将 Z 轴映射到 -Y,这就是您观察到的。 因此,接下来发生的任何转变都是从这个开始的。 使用 glLoadIdentity 重新为每个对象构建整个转换以重置为标识,或使用 glPushMatrix / glPopMatrix 创建“转换块”的层次结构。 或者更好的是,完全放弃 OpenGL 内置矩阵堆栈,并将其替换为适当的矩阵数学库,如 GLM、Eigen 或类似库。 回答2 回答3 在实践中,克服这个问题的最佳方法是使用四元数,这是相当多的数学运算。 你是对的; 如果你将它围绕 Y 旋转 90 度,而不是你想围绕 Z 旋转它,你将围绕 X 旋转。 这是将欧拉角转换为四元数的好来源:http://www.euclideanspace.com/maths/geometry/rotations/conversions/eulerToQuaternion/ 这里是如何用一个四元数制作一个旋转矩阵:http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToMatrix/ 填充矩阵后

2022-07-11 09:40:03    分类:技术分享    opengl   matrix   rotation

How to make 360 video output in opengl

问题 我想要 OpenGL 输出和球面投影来制作 360 视频。 现在我有立方体贴图面,它们是用 6 个透视相机生成的。 我需要这样的东西: 我怎么能有这个输出? 任何的想法? 回答1 这取决于您期望使用的确切投影。 对于简单的球形投影,您可以使用以下片段着色器将四边形渲染到目标纹理中: uniform samplerCube tex; in vec2 texcoord; out vec4 OUT; void main() { vec3 d = vec3( cos(texcoord[0])*cos(texcoord[1]), sin(texcoord[0])*cos(texcoord[1]), sin(texcoord[1]) ); OUT = texture(tex, d); } texcoord应在左下角的(tau/2, tau/4) (-tau/2,-tau/4)右上角的 (tau/2, tau/4) 之间变化。

2022-05-17 00:45:22    分类:技术分享    opengl   shader   panoramas   360-degrees

GLUT Error in Haskell Program

问题 我正在使用带有 Haskell 的 OpenGL。 我尝试了一个示例程序,它使用 ghc Compiler 成功编译,但是当我运行它时,出现此错误 用户错误(未知的 GLUT 条目 glutInit) 我对此进行了搜索,但大多数答案都与此问题有关,即 mac OS X 和 Windows。 但是我在 Ubuntu 15 上遇到了这个错误。 这个问题以前被问过,但与windows有关 下面是我使用的示例程序。 import Graphics.Rendering.OpenGL import Graphics.UI.GLUT main :: IO () main = do (_progName, _args) <- getArgsAndInitialize _window <- createWindow "Hello World" displayCallback $= display mainLoop display :: IO () display = do clear [ ColorBuffer ] 回答1 sudo apt-get install freeglut3

2022-05-16 16:00:25    分类:技术分享    haskell   opengl   glut   freeglut

Understanding the relationship between glutDisplayFunc and glutPostRedisplay

问题 在阅读红皮书时,我发现: glutDisplayFunc(void (*func)(void)) 是您将看到的第一个也是最重要的事件回调函数。 每当 GLUT 确定需要重新显示窗口的内容时,就会执行 glutDisplayFunc() 注册的回调函数。 因此,您应该将重绘场景所需的所有例程都放在显示回调函数中。 如果您的程序更改了窗口的内容,有时您将不得不调用 glutPostRedisplay(),这会促使 glutMainLoop() 在下次有机会时调用已注册的显示回调 应该调用 glutPostRedisplay() 的时间是什么时候? 从这一段中,我不明白为什么需要它的功能。 回答1 每当您的窗口必须重新绘制时,都会调用 glutDisplayFunc。 这包括调用 glutPostRedisplay 的时间 :) 什么时候需要重绘窗口? 当它的大小改变时当它变得可见时当它的某些部分变得可见时当它被移动时 ETC 但是,如果您的显示函数在 x;y 位置绘制一个三角形,其中 x;y; 是由鼠标位置决定的吗? 在这种情况下,您必须在鼠标向右移动时要求系统重新绘制窗口? 这就是为什么你会从 MouseFunc() 调用 glutPostRedisplay。 实际上,当您调用 glutPostRedisplay 时,重绘事件与其他窗口事件一起排队,例如鼠标单击等。 本质上

2022-05-16 01:44:16    分类:技术分享    opengl   glut

UV mapping a proceduraly generated sphere in OpenGL

问题 我正在尝试对地球上的 2D 纹理进行 UV 处理。 这是一段代码: double delta = 0.0, // angle of latitude theta = 0.0, // angle of longitude theta_interval = (2.0 * M_PI) / latitude, // angle of latitude delta_interval = M_PI / longitude, // angle of longitude u_lats = 0.0, v_longs = 0.0, u_lats_interval = 1.0 / latitude, v_longs_interval = 1.0 / longitude; for (int i = 0; i < longitude; ++i) { for (int j = 0; j < latitude; ++j) { double x0 = calc_x0(radius, x, theta, delta), y0 = calc_y0(radius, y, theta, delta), z0 = calc_z0(radius, z, theta, delta), u0 = u_lats, v0 = v_longs + v_longs_interval, x1 = calc_x1(radius, x

2022-05-15 12:09:12    分类:技术分享    opengl   procedural-generation   uv-mapping   sphere.io

GLFW: profile requested but WGL_ARB_create_context_profile is unavailable

问题 由于以下错误消息(我在 Windows 上),我无法打开 OpenGL 窗口: GLFW Error Code 65543: WGL: OpenGL profile requested but WGL_ARB_create_context_profile is unavailable. 我的问题很可能是驱动程序问题。 我尝试更新它们(使用英特尔驱动程序更新实用程序),但没有成功(而且我的驱动程序似乎已经是最新的)。 我使用内置的 Intel HD Graphics 3000。我还安装了一个 OpenGL 查看器,它告诉我我的 OpenGL 版本是 3.1)。 另外,我尝试了这个解决方案。 整个 C++ 代码非常庞大,所以我不会全部复制,但这里是有趣的部分: if( !glfwInit() ) { std::cerr<<"Failed to initialize GLFW\n"<<std::endl; return -1; } glfwSetErrorCallback(glfwErrorCallback); // Create the OpenGL window glfwWindowHint(GLFW_DEPTH_BITS, 16); glfwWindowHint(GLFW_SAMPLES, 4); //Those stop GLFW from initializing

2022-05-15 05:31:16    分类:技术分享    c++   opengl   glfw

How to minimize glVertexAttribPointer calls when using Instanced Arrays?

问题 我的 OpenGL 代码使用一个 VAO 处理所有模型数据和两个 VBO。 第一个用于标准顶点属性,如位置和法线,第二个用于模型矩阵。 我正在使用实例绘制,所以我将模型矩阵加载为实例数组(基本上是顶点属性)。 首先,我将标准顶点属性加载到 VBO 并使用glVertexAttribPointer设置所有内容。 然后我将模型矩阵加载到另一个 VBO。 现在我必须在绘图循环中调用glVertexAttribPointer 。 我能以某种方式防止这种情况吗? 代码如下所示: // vertex data of all models in one array GLfloat myvertexdata[myvertexdatasize]; // matrix data of all models in one array // (one model can have multiple matrices) GLfloat mymatrixdata[mymatrixsize]; GLuint vao; glGenVertexArrays(1, &vao); glBindVertexArray(vao); GLuint vbo; glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY

2022-05-14 07:16:07    分类:技术分享    opengl   vertex-buffer   vertex-array-object

Computer Graphics: Rotating a polygon

问题 目的 我正在使用 Java AWT 实现多边形旋转。 我已经能够在屏幕上绘制多边形,并且我想在我的多边形坐标上手动应用一个旋转矩阵(旋转是围绕用户的 lookAt 点完成的)。 我已经做了什么 为了旋转世界,用户首先点击屏幕然后拖动鼠标来执行旋转。 让我们将第一个单击点记为 S,将拖动事件的下一个点记为 L,将屏幕中心记为 C。 为了计算旋转角度,在第一次点击屏幕时,我保留了一个从 C 到 S 的向量:CS。 然后,当拖动事件发生时,我计算从 C 到 L 的向量:CL。 然后我计算 CS 到 CL 之间的弧度角,这就是我在我的世界中应用的。 这很好用,并且多边形确实围绕lookAt 点旋转。 我的问题 当用户完成 PI 的旋转,然后多边形向后旋转时,就会出现问题。 例如,当用户开始旋转时,角度从 0.1.... 0.2... 1.. 2.. 3.. 开始,值 ~3.1(我假设为 PI),值开始下降:3。 .. 2.. 1.. 直到 0,反之亦然。 这是有道理的,因为弧度范围是 [0, PI]。 我假设基向量 CS 位于 X 轴的右侧,当旋转低于 X 轴时,多边形向后旋转。 但是,我不知道如何使多边形始终沿同一方向旋转(当用户围绕多边形执行完整旋转时)。 编辑 角度函数为: public final double angle(Vector2D v1) { double vDot

2022-05-14 04:24:03    分类:技术分享    java   opengl   math   graphics   3d

OpenGL compute shader buffer allocation fails

问题 我正在尝试在这样的计算着色器中使用缓冲区: layout (binding = 1, std430) writeonly buffer bl1 { uint data[gl_WorkGroupSize.x * gl_NumWorkGroups.x * gl_NumWorkGroups.y]; }; 但我收到以下错误(因为使用 gl_NumWorkGroups 作为大小): Array size must be a constant integer expression 我该如何解决这个问题? 回答1 完全停止输入长度: layout (binding = 1, std430) writeonly buffer bl1 { uint data[]; }; 这是 SSBO 独有的功能。 并且您只能在 SSBO 中有一个未调整大小的数组,并且它必须是接口块中的最后一个成员。 data的大小将根据您绑定到该绑定点的缓冲区对象范围的大小来计算。 所以如果你绑定 32KB 的缓冲区空间,你会得到 8K 的项(一个uint的大小是 4 个字节)。 在运行时,您的着色器可以使用gl_WorkGroupSize.x * gl_NumWorkGroups.x * gl_NumWorkGroups.y来计算data的长度。 或者,只需使用data.length()来获取用户给你的缓冲区的长度。

2022-05-13 19:10:04    分类:技术分享    opengl   buffer   compute-shader