- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试制作一个在 OpenGL 2.1 和 Qt5 中渲染的简单 map 。但我在非常基本的问题上失败了。我在这里展示的是表面法线。
我有 4 个由单个三角形几何体组成的对象。一个简单的几何图形是动态分配的 Vertex
数组,其中 Vertex 是两个 QVector3D
的一对,这是 Qt 中预定义的 3D 位置类。
struct Vertex
{
QVector3D position;
QVector3D normal;
};
我通过使用从该顶点到下一个或上一个顶点的两个 vector 的叉积来计算该顶点的法线。通过调试或将结果打印到控制台,结构的正常计算似乎没问题。
QVector3D(-2, -2, -2) has normal QVector3D(0, 0, 1)
QVector3D(2, -2, -2) has normal QVector3D(0, 0, 1)
QVector3D(-2, 2, -2) has normal QVector3D(0, 0, 1)
...
但是当我将数据提供给着色器时,结果是荒谬的!这是一张多边形的图片,每个位置都用正常值着色:
与法线贴图一样,红色=x、绿色=y 和蓝色=z。黑色方 block 的左上角是世界的原点。如您所见,法线在某个点似乎只是该点的位置,没有 z 值。知道绘画代码是,你能提示我可能有什么问题吗:
glUseProgram(program.programId());
glEnableClientState(GL_NORMAL_ARRAY);
program.setUniformValue("modelViewProjectionMatrix", viewCamera);
program.setUniformValue("entityBaseColor", QColor(0,120,233));
program.setUniformValue("sunColor", QColor("white"));
program.setUniformValue("sunBrightness", 1.0f);
static QVector3D tmpSunDir = QVector3D(0.2,-0.2,1.0).normalized();
program.setUniformValue("sunDir",tmpSunDir);
for( size_t i = 0; i < m_numberOfBoundaries; ++i)
{
glBindBuffer(GL_ARRAY_BUFFER, m_bufferObjects[i]);
int vertexLocation = program.attributeLocation("vertexPosition");
program.setAttributeArray( vertexLocation, GL_FLOAT, &(m_boundaries[i].data->position), sizeof(Vertex) );
program.enableAttributeArray(vertexLocation);
glVertexAttribPointer( vertexLocation, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0 );
int vertexNormal = program.attributeLocation("vertexNormal");
program.setAttributeArray( vertexNormal, GL_FLOAT, &(m_boundaries[i].data->normal), sizeof(Vertex) );
program.enableAttributeArray(vertexNormal);
glVertexAttribPointer( vertexNormal, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0 );
glDrawArrays( GL_POLYGON, 0, m_boundaries[i].sizeOfData );
}
glDisableClientState(GL_NORMAL_ARRAY);
其中边界是多边形的几何连接组件。 程序
是一个QOpenGLShaderProgram
,一个Qt abstraction for shader programs .每个边界都绑定(bind)到一个缓冲区对象。缓冲区对象编号存储在数组 m_bufferObjects
中。多边形“边界”作为 struct
存储在数组 m_boundaries
中。它们有两个字段:data
,一个指向循环顶点数组起点的指针,以及 sizeOfData
,多边形的点数。
最佳答案
在我解决你的真正问题之前,这里有一些可能无关但同样错误的东西:
glEnableClientState(GL_NORMAL_ARRAY);
/*...*/
glDisableClientState(GL_NORMAL_ARRAY);
您使用的是自定义顶点属性,因此使用那些旧的固定功能管道客户端状态位置绝对没有意义。使用 glEnableVertexAttribArray(location_index)
代替,
所以我终于转身仔细查看了您的代码,您的问题是混合了 Qt 的抽象层和原始 OpenGL 命令的使用。本质上,您的问题归结为您在调用 QOpenGLShaderProgram::setAttribArray
之后调用 glVertexAttribPointer
时绑定(bind)了 VBO。
一个问题是,setAttribArray
会在内部为您调用 glVertexAttribPointer
,因此您自己对它的调用是多余的,并且会覆盖 Qt 所做的任何事情。更严重的问题是,您确实有一个由 glBindBuffer
绑定(bind)的 VBO,因此对 glVertexAttribPointer
的调用实际上是将字节偏移量放入 VBO 数据而不是指针(实际上VBO 绑定(bind)传递 0,在指针术语中是空指针,将产生完全有效的数据偏移量)。请参阅我的这个答案,为什么这有点误导并且实际上违反了 C 规范:https://stackoverflow.com/a/8284829/524368
最近的 OpenGL 版本实际上有一个新的 API,用于指定符合 C 语言规范的属性数组偏移量。
要使用的正确 Qt 方法是 QOpenGLShaderProgramm::setAttribBuffer
。不幸的是,您的代码没有显示 m_boundaries 的确切定义以及您对 glBufferData
或 glBufferSubData
的调用;如果我有,我可以指导您如何更改您的代码。
关于c++ - 如何正确链接 OpenGL 着色器的开放式 GL 法线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22683567/
我在将示例 laravel 5.2 应用程序部署到 openshift 时遇到问题。我找到了这个quickstart在 github 上并尝试了下面列出的手动安装。 rhc app create la
我刚刚开始使用 OpenCV,我发现了 contourArea 函数的一些非常奇怪的行为。 看到这张图片。 它有三个不相连的区域,左侧是一组长笔划,顶部中心有一个点,最后是右侧的一个大方块。 当我运行
我经常发现自己尝试从数值变量+用户提供的一组范围创建分类变量。 例如,假设我有一个带有数值变量 df$V 的 data.frame并想创建一个新变量 df$VCAT这样: df$VCAT = 0 如果
启动 MXBean 时,我收到错误提示 Method SampleServiceMXBean.register 具有无法转换为开放类型的参数或返回类型。根据错误消息,很明显我的 MXBean 无法 c
大多数时候在 CUDA 或 OpenCL 程序中需要分支,例如: for (int i=0; i
我们有一个可能有用的自制框架实现基于 REST 的网络服务。 这是一个 .net c# 项目,用于 web 应用程序。 它的用途是:用动态内容内联替换模板“标签”。示例标签:{{recentposts
是否有 Java 中 SMB/CIFS 服务器的开放实现?我能找到的唯一实现是 Alfresco 的,但它不是开源的。 一个相关的问题:假设没有这样的实现,我很惊讶没有一个库提供甚至是 SMB 的一个
我已将我的应用程序从本地主机移至 OpenShift,发现 PostgreSQL 连接存在问题。我已经配置了pom.xml: org.postgresql postgresql
我正在尝试在 AWS ec2 实例上配置 SSL 证书,我遵循了以下步骤: 使用 ubuntu 操作系统在 ec2 上创建实例。 通过证书管理器在我的域上颁发证书 -> 例如:*.domains.co
我正在尝试在打开的模式上执行 jQuery 脚本,以便将其中一个字段转换为 jQuery UI Spinner。 我正在使用Angular UI中记录的opened promise 。 问题:jQue
有没有办法将服务帐户 secret 内容填充到环境变量中? 示例:当一个 pod 启动时,它包含一个 /var/run/secrets/kubernetes.io/secrets/serviceacc
我在 security 和 components/securitySchemes 中定义了我的身份验证。在Swagger documentation about response ,他们提供了这个例子
我是一名优秀的程序员,十分优秀!