相关疑难解决方法(0)

如何从头开始用人类可读的角度组成旋转矩阵?

总是阻碍我做3D编程的一件事是无法理解数学是如何工作的.我可以使用方法和函数在编程流程中使用数学,然后它对我来说都是清晰和合乎逻辑的,但在数学符号中,我无法从它做出正面或反面.

我一直在阅读网站,观看研究所试图解释这个问题的视频,但他们都使用数学符号,我只是迷失在其中,我的思想不会将其转化为可理解的东西.我可能有缺陷.

另外,只是使用某人的代码不是我的兴趣,我想了解它背后的机制,逻辑.我很乐意使用其他人的代码,但我真的想了解它是如何工作的.

这个问题

你能用简单的术语向我解释没有数学符号,只是编程符号/函数/伪代码,如何沿所有3轴实现矩阵变换?

理想情况下我想要的是编写方法/对象的材料/理解,我可以在其中定义3个轴的角度,类似于glRotate,以旋转我所拥有的四边形/三角形的集合.(我正在尝试编写立方体形状的3D旋转而无需访问OpenGL函数来为我执行此操作,因为每次在显示列表中发生更改时,都会在一次绘制调用中完成.)

我做了什么?

我试图制作一个90度的变换函数来获得数学的悬念,但是在制作一个理论上最简单的矩阵时却完全失败了.你可以在http://jsfiddle.net/bLfg0tj8/5/看到我失败的尝试.

Vec3 = function(x,y,z) {
    this.x = x;
    this.y = y;
    this.z = z;
}
Matrix = function Matrix() {
    this.matrixPoints = new Array();    
    this.rotationPoint = new Vec3(0,0,0);
    this.rotationAngle = 90;
}
Matrix.prototype.addVector = function(vector) {
    this.matrixPoints.push(vector);
}
Matrix.prototype.setRotationPoint = function(vector) {
    this.rotationPoint = vector; 
}
Matrix.prototype.setRotationAngle = function(angle) {
    this.rotationAngle = angle;
}
Matrix.prototype.populate = function() {
    translateToOrigin =     [[1,0,0-this.rotationPoint.x],
                                  [0,1,0-this.rotationPoint.y],
                                  [0,0,0-this.rotationPoint.z]];
    rotationMatrix =         [[0,-1,0],
                                  [0,1,0],
                                  [0,0,1]];
    translateEnd …
Run Code Online (Sandbox Code Playgroud)

opengl math 3d matrix

23
推荐指数
1
解决办法
6941
查看次数

OpenGL - 对象轮廓

我正在尝试实现选择轮廓功能.这就是我现在所要做的.

在此输入图像描述

如您所见,当鼠标悬停并在所选对象周围绘制轮廓时,可以正确选择对象.

我现在想做的是以这种方式勾勒出对象的可见边缘

在此输入图像描述

左边的图像是我现在拥有的,右边的图像是我想要实现的.

这是我现在使用的程序.

void paintGL()
{
    /* ... */

    int w = geometry().width();
    int h = geometry().height();

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_STENCIL_TEST);
    glStencilFunc(GL_NOTEQUAL, 1, 0xFF);
    glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
    glStencilMask(0xFF);

    setClearColor(Qt::GlobalColor::darkGray);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

    glStencilMask(0x00);
    DrawGeometry();

    if (HoveredSphere != RgbFromColorToString(Qt::GlobalColor::black))
    {
        glBindFramebuffer(GL_FRAMEBUFFER, addFBO(FBOIndex::OUTLINE));
        {
            glStencilFunc(GL_ALWAYS, 1, 0xFF);
            glStencilMask(0xFF);

            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

            DrawOutline(HoveredSphere, 1.0f - 0.025f);
        }
        glBindFramebuffer(GL_FRAMEBUFFER, defaultFramebufferObject());

        glBindFramebuffer(GL_READ_FRAMEBUFFER, addFBO(FBOIndex::OUTLINE));
        glBindFramebuffer(GL_DRAW_FRAMEBUFFER, defaultFramebufferObject());
        {
            // copy stencil buffer
            GLbitfield mask = GL_STENCIL_BUFFER_BIT;
            glBlitFramebuffer(0, 0, w, h, 0, 0, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl graphics outlining highlight

7
推荐指数
1
解决办法
1122
查看次数

OpenGL - OBJ中的顶点法线

我想知道如何使用顶点法线来实现闪电效果?目前我所拥有的是我可以将顶点和纹理坐标发送到着色器并使用它们但是使用法线,我不知道如何在着色器程序中使用它们.以下是我到目前为止的情况.

    // vertex shader
    layout(location = 0) in vec4 vert;
    layout(location = 1) in vec4 color;
    layout(location = 2) in vec2 texcoord;
    uniform mat4 m_model;
    uniform mat4 m_view;
    uniform mat4 m_proj;
    void main() {
        gl_Position = m_proj * m_view * m_model * vert;
    }

    // fragment shader
    in vec2 fragtexcoord;
    out vec4 color;
    uniform sampler2D textureunit;
    void main(void) {
        color = texture(textureunit, fragtexcoord);
    }
Run Code Online (Sandbox Code Playgroud)

编辑 以下是我的着色器.

顶点着色器

    layout(location = 0) in vec4 vert;
    layout(location = 1) in vec4 color;
    layout(location …
Run Code Online (Sandbox Code Playgroud)

c++ opengl shader opengl-es wavefront

5
推荐指数
1
解决办法
3216
查看次数

如何在GLSL中实现2D光线投射光效果

这最初是@sydd 在这里询问的。我对此很好奇,所以我尝试对其进行编码,但是在我回答之前,它已被关闭/删除,所以就在这里。

问题:如何在GLSL中复制/实现这种 2D射线投射照明效果?

效果本身将光线从鼠标位置投射到各个方向,从而累积了背景贴图的alpha和影响像素强度的颜色。

因此输入应为:

  • 滑鼠位置
  • 背景RGBA地图纹理

opengl graphics 2d glsl raycasting

4
推荐指数
1
解决办法
3824
查看次数

OpenGL Scale单像素线

我想制作一个内部为320x240的游戏,但以整数倍(640x480,960,720等)渲染到屏幕.我打算复古的2D像素图形.

我通过glOrtho()设置内部分辨率来实现这一点:

glOrtho(0, 320, 240, 0, 0, 1);
Run Code Online (Sandbox Code Playgroud)

然后我将输出分辨率放大3倍,如下所示:

glViewport(0,0,960,720);
window = SDL_CreateWindow("Title", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 960, 720, SDL_WINDOW_OPENGL);
Run Code Online (Sandbox Code Playgroud)

我画这样的矩形:

glBegin(GL_LINE_LOOP);
glVertex2f(rect_x, rect_y);
glVertex2f(rect_x + rect_w, rect_y);
glVertex2f(rect_x + dst_w, dst_y + dst_h);
glVertex2f(rect_x, rect_y + rect_h);
glEnd();
Run Code Online (Sandbox Code Playgroud)

它完美地工作在320x240(未缩放):

在此输入图像描述

当我扩展到960x720时,像素渲染一切正常!然而,似乎GL_Line_Loop不是在320x240画布上绘制并按比例放大,而是在最终的960x720画布上绘制.结果是3px世界中的1px行:(

在此输入图像描述

如何在320x240 glOrtho画布上绘制线条,而不是960x720输出画布?

c++ opengl sdl pixel line

2
推荐指数
1
解决办法
995
查看次数

VR 中的着色器分析

我想创建一个像这样的着色器,它采用世界坐标并创建波浪。我想分析视频并了解所需的步骤。我不是在寻找代码,我只是在寻找如何使用 GLSL 或 HLSL 或任何其他语言来实现它的想法。

这里是低质量和 fps GIF,以防链接中断。

视频

这是片段着色器:

#version 330 core

// Interpolated values from the vertex shaders
in vec2 UV;
in vec3 Position_worldspace;
in vec3 Normal_cameraspace;
in vec3 EyeDirection_cameraspace;
in vec3 LightDirection_cameraspace;

// highlight effect
in float pixel_z;       // fragment z coordinate in [LCS]
uniform float animz;    // highlight animation z coordinate [GCS]

// Ouput data
out vec4 color;
vec3 c;

// Values that stay constant for the whole mesh.
uniform sampler2D myTextureSampler;
uniform mat4 MV;
uniform vec3 …
Run Code Online (Sandbox Code Playgroud)

opengl directx shader augmented-reality

1
推荐指数
1
解决办法
890
查看次数