gpt4 book ai didi

android opengl es 2.0 glm 投影不工作

转载 作者:行者123 更新时间:2023-11-28 06:28:55 25 4
gpt4 key购买 nike

我正在使用 c/c++ (NDK) for android 在 opengl es 2.0 中编程。由于没有适用于 Android 的官方 C++ 库,我使用的是 GLM 库!

到目前为止,我可以在黑色背景上绘制一个白色三角形,而无需应用任何投影/截锥体或相机/ View 矩阵。当然,这会导致三角形显示为沿屏幕宽度缩放。

然而,一旦我应用相机和投影变换,三角形就会从场景中消失,只出现背景颜色。

这是相关代码:

float triangleCoords[] = {   // in counterclockwise order:
0, 1, 0, // top
-1, 0, 0, // bottom left
1, 0, 0 // bottom right
};

std::string vertexShaderCode =
"attribute vec4 vPosition; "
"uniform mat4 uMVPMatrix; "
"void main() {"
" gl_Position = uMVPMatrix*vPosition;"
"}";

std::string fragmentShaderCode =
"precision mediump float;"
"uniform vec4 vColor;"
"void main() {"
" gl_FragColor = vColor;"
"}";

mvpMatrix=glm::translate(mvpMatrix,vec3(0,-0.5,0));

mvpMatrix*=glm::lookAt(vec3(0,0,-3),vec3(0,0,0),vec3(0,1,0));

mvpMatrix*=glm::frustum(-1.0f,1.0f,-ratio,ratio,3.0f,7.0f);

其中 vec3 是“typedef glm::vec3”,mvpMatrix 是“glm::mat4x4”

我已经尝试了很多方法,例如在视锥体之前乘以 lookAt 并改变视锥体的近远值等。

我也试过改变三角形坐标看它是否被剪裁但无济于事

但是,如果未应用 lookAt 和 frustum,则 0.5 单位的转换将正常工作,这意味着从矩阵到着色器的值传递是正确的。

帮我解决这个问题

最佳答案

您没有正确使用 glm 库。

您在着色器中使用的约定(匹配旧的固定功能管道的默认约定以及 glm 的约定)是 matrix * vector

当您将多个变换组合到一个矩阵时,您会得到以下结果:M=A*B*C 并将其应用于某个 vector v 作为 v' = M * v。但这与 v' = A * ( B * ( C * v)) 相同,因此 C 实际上是 首先 应用的。在你的情况下,你有 M * V * P,但正确的“ModelViewProjection”转换首先应用模型转换(到达世界空间),然后是 View 转换(到达眼睛空间),最后投影变换到裁剪空间,所以你需要 P * V * M

请注意,根据您选择的数字,三角形最终会恰好位于近平面 - 但由于数值不精确,它可能仍会被剔除。

关于android opengl es 2.0 glm 投影不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28013319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com