小编C0d*_*0dR的帖子

使用glm以局部和全局方向旋转和平移对象

我正在尝试实现函数,我可以使用glm在局部或全局方向上旋转/平移对象,就像在3D建模软件中一样.像这样的东西:

void Rotate(float x, float y, float z, bool localOrientation);
Run Code Online (Sandbox Code Playgroud)

但我不知道如何让它工作.局部旋转旋转应该是这样的(?):

m_Orientation *= glm::rotate(x, glm::vec3(1,0,0);
m_Orientation *= glm::rotate(y, glm::vec3(0,1,0);
m_Orientation *= glm::rotate(z, glm::vec3(0,0,1);

// (m_Orientation is glm::mat4)
Run Code Online (Sandbox Code Playgroud)

但如何将其与当地定位相结合?实际上我需要在世界方向旋转旋转矩阵,对吧?我希望你知道我对于本地和全球导向的旋转/翻译的意义,就像在3D建模程序中一样.在大多数情况下,您可以在本地和全局之间切换按钮.

那么我如何计算前进/右/向上矢量呢?通常它应该是这样的,对吧?:

forward = m_Orientation * glm::vec4(0,0,-1,0);
Run Code Online (Sandbox Code Playgroud)

我用这个尝试了全局轮换:

m_GlobalOrientation = glm::rotate(m_GlobalRotation.x, glm::vec(1,0,0);
m_GlobalOrientation *= glm::rotate(m_GlobalRotation.y, glm::vec(0,1,0);
m_GlobalOrientation *= glm::rotate(m_GlobalRotation.z, glm::vec(0,0,1);
Run Code Online (Sandbox Code Playgroud)

但是只有x旋转处于全局方向,y和z旋转处于局部方向,因为它已经围绕x轴旋转.所以我需要一次旋转所有3个角度(?)

翻译本地应该只是将翻译值添加到当前翻译中,而本地翻译应该是glm :: inverse(m_Orientation)*translationVector对吗?

c++ opengl math rotation glm-math

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

OpenGL GBuffer法线和深度缓冲问题

我终于让我的GBuffer工作了(不是真的),但现在我有一些奇怪的问题,我找不到原因.

当我将普通纹理绘制到屏幕时,法线始终显示给我(蓝色始终指向相机).我不知道如何正确解释它,所以这里有一些屏幕:

(我认为这就是我的照明通道看起来很奇怪的问题)

以下是我创建GBuffer的方法:

glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo);

// generate texture object
glGenTextures(GBUFFER_NUM_TEXTURES, textures);
for (unsigned int i = 0; i < 4; i++)
{
    glBindTexture(GL_TEXTURE_2D, textures[i]);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_FLOAT, 0);
    glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, textures[i], 0);

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
}

// generate depth texture object
glGenTextures(1, &depthStencilTexture);
glBindTexture(GL_TEXTURE_2D, depthStencilTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT,NULL);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthStencilTexture, 0);

// generate output texture object
glGenTextures(1, &outputTexture);
glBindTexture(GL_TEXTURE_2D, …
Run Code Online (Sandbox Code Playgroud)

opengl shader glsl deferred-shading

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

GLSL片段着色器结构输出

我的GLSL着色器有问题.当我想编译片段着色器部分时,我收到以下错误:

0:24: error(#181) Cannot be used with a structure: out
error(#273) 1 compilation errors. No code generated
Run Code Online (Sandbox Code Playgroud)

所以问题就在于我的变量,我假设.这是我的片段着色器:

#version 410

uniform mat4 gWVP;
uniform mat4 gWorld;

uniform sampler2D gColorMap;                

in VSOutput
{
    vec3 WorldSpacePos;
    vec2 TexCoord;
    vec3 Normal;  
} FSin;


struct FSOutput
{                   
    vec3 WorldSpacePos;    
    vec3 Diffuse;     
    vec3 Normal;      
    vec3 TexCoord;
};

out FSOutput FSOut;

void main()
{                                           
    FSOut.WorldSpacePos = FSin.WorldSpacePos;                   
    FSOut.Diffuse      = texture(gColorMap, FSin.TexCoord).xyz; 
    FSOut.Normal       = normalize(FSin.Normal);                    
    FSOut.TexCoord     = vec3(FSin.TexCoord, 0.0);              
}
Run Code Online (Sandbox Code Playgroud)

我知道应该可以在OpenGL 4.0+中输出结构,不应该吗?所以我没有得到错误,是驱动程序问题还是类似的东西?我正在运行带有13.4驱动程序的Radeon HD 6950.

opengl shader compilation glsl

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

标签 统计

opengl ×3

glsl ×2

shader ×2

c++ ×1

compilation ×1

deferred-shading ×1

glm-math ×1

math ×1

rotation ×1