- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在关注 learnopengl.com 的光照教程,但由于某种原因,我的光照被严重搞砸了,我不知道为什么。我有环境光可以轻松工作,漫反射有点问题,到处都是镜面光,我不知道去哪里修复它。 https://gyazo.com/f66efc10d41806504e9e34f45415bcfe我也不确定我的法线是否制作正确。以下是我如何使用 std::vector<glm::vec3>
生成它们职位和std::vector<unsigned int>
指数。
void ModMesh::generateVertexNormals() {
if(!positions.empty() || !indices.empty()) {
normals.clear();
for(unsigned int i = 0; i < indices.size(); i += 3) {
auto const a = indices[i + 0];
auto const b = indices[i + 1];
auto const c = indices[i + 2];
auto const verta = positions[a];
auto const vertb = positions[b];
auto const vertc = positions[c];
auto const norm = glm::normalize(glm::cross(verta - vertb, vertc - vertb));
normals.push_back(norm);
}
}
}
这是我绑定(bind)数据的方式:
void ModMesh::generateVBO_Positions() {
if(positions.empty())
return;
glBindBuffer(GL_ARRAY_BUFFER, vbo[VBO::POS]);
std::vector<float> p;
for(int i = 0; i < positions.size(); i++) {
p.push_back(positions[i].x);
p.push_back(positions[i].y);
p.push_back(positions[i].z);
}
glBufferData(GL_ARRAY_BUFFER, p.size() * sizeof(float), &p[0], GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
}
void ModMesh::generateVBO_Normals() {
if(normals.empty())
return;
glBindBuffer(GL_ARRAY_BUFFER, vbo[VBO::NORM]);
std::vector<float> n;
for(int i = 0; i < positions.size(); i++) {
n.push_back(positions[i].x);
n.push_back(positions[i].y);
n.push_back(positions[i].z);
}
glBufferData(GL_ARRAY_BUFFER, n.size() * sizeof(float), &n[0], GL_STATIC_DRAW);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(2);
}
这是我的代码。
顶点
#version 330 core
layout(location = 0) in vec3 iPosition;
layout(location = 1) in vec2 iTexcoord;
layout(location = 2) in vec3 iNormal;
uniform mat4 iProjection;
uniform mat4 iView;
uniform mat4 iModel;
out vec2 texcoord;
out vec3 normal;
out vec3 fragpos;
void main() {
gl_Position = iProjection * iView * iModel * vec4(iPosition, 1.0);
texcoord = iTexcoord;
normal = iNormal;
fragpos = vec3(iModel * vec4(iPosition, 1.0));
}
片段
#version 330 core
in vec2 texcoord;
in vec3 normal;
in vec3 fragpos;
uniform sampler2D iTexture;
uniform vec3 iCameraView;
uniform int iUseTexture = 0;
out vec4 outputcolor;
struct Light {
vec3 position;
vec3 ambient;
vec3 diffuse;
vec3 specular;
};
uniform Light iLight;
struct Material {
vec3 ambient;
vec3 diffuse;
vec3 specular;
float shininess;
};
uniform Material iMaterial;
void main() {
float ambientstrength = 0.15;
float specularstrength = 0.75;
vec3 norm = normalize(normal);
vec3 lightdir = normalize(iLight.position - fragpos);
vec3 ambient = iLight.ambient * iMaterial.ambient;
vec3 viewdir = normalize(iCameraView - fragpos);
vec3 reflectdir = reflect(-lightdir, norm);
float diff = max(dot(norm, lightdir), 0.0);
float spec = pow(max(dot(viewdir, reflectdir), 0.0), iMaterial.shininess);
vec3 diffuse = (diff * iMaterial.diffuse) * iLight.diffuse;
vec3 specular = specularstrength * spec * iLight.specular;
vec4 light = vec4(ambient + diffuse + specular, 1.0);
outputcolor = mix(vec4(0.0, 1.0, 0.0, 1.0) * light, texture2D(iTexture, texcoord) * light, iUseTexture);
}
C++ 片段,main.cpp:
olib::Camera cam(0.0f, 0.5, -3.0f); // My camera object, just the position XYZ
glm::mat4 proj(1.0);
glm::mat4 view(1.0);
glm::mat4 model(1.0);
proj = glm::perspective(glm::radians(45.0f), (float)win.getWidth() / (float)win.getHeight(), 0.1f, 500.0f);
while(win.isOpen()) {
sh.enable();
sh.uniformMat4("iProjection", proj);
sh.uniformMat4("iView", view);
sh.uniformMat4("iModel", model);
sh.uniform3f("iCameraView", cam.getPosition());
sh.uniform3f("iLight.position", 0, 0.5, -3);
sh.uniform3f("iLight.ambient", 0.14, 0.14, 0.14);
sh.uniform3f("iLight.diffuse", 0.64, 0.64, 0.64);
sh.uniform3f("iLight.specular", 0.84, 0.84, 0.84);
view = cam.getViewMatrix();
// Then drawing
}
我认为这些数据很重要。万一它不在这里是一个github。 https://github.com/LoneC/OpenGL-Project/tree/master
最佳答案
首先,也是最重要的是,您在这个过程中走在了正确的轨道上:“无效 ModMesh::generateVertexNormals()”。您正在为 OpenGL 的 front = CCW 设置生成每个三角形的正面法线。问题是,您正在为每个三角形生成一个法线,而在您的顶点着色器中,法线是按每个顶点传递的。但是在您的情况下,每个三角形生成 1 个法线!您之后应该做的是遍历每个顶点位置,并为使用该位置的每个三角形获取其法线,然后对该法线进行平均。这样你就可以平滑每个顶点处三角形的法线。让我以更图形化的方式解释一下:
我必须补充一点,您目前也在将位置上传到 VBO 法线,但这就是我在评论中告诉您的内容。
如果你真的想要平面着色,那么,就我现在能想到的,你必须放弃索引并为每个三角形使用 3 个位置,每个三角形的法线来自你当前的法线生成方法,每个位置一式三份就像我绘画的第二步一样。顺便说一句,请原谅我的绘画。
关于c++ - GLSL 光照数学一团糟,找不到错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53753139/
我知道这听起来很烦人,但有时感觉 Android 的 UI 组件和行为有些离谱。 考虑以下 XML: 在不同尺寸的设备上显示效果的屏幕截图: Nexus S 评分栏 平板电脑评分栏 小型
我之前在我的系统上安装了 ruby 1.8.7。有一段时间我安装了 rvm。从那时起,就有了一个巨大的困惑。例如,尝试启动 Sinatra 服务器会导致: /home/yoni/.rvm/rubi
因此 Google 采用: http://www.mysite.com/mypage/#!pageState 并将其转换为: http://www.mysite.com/mypage/?_escape
我有一个可能非常简单的问题,我无法在 Zend Framework 手册或其他地方找到令人满意的(主观上看到的)答案... 我可以通过多种方式将我的 php 变量移交给我的 sql 查询,以至于我失去
我是一名网络开发新手,希望有更多经验的人可以提供帮助。 I'm red on hover I'm red on hover html, body
我正在阅读有关 WebApi 授权的多种资源(书籍和 SO 答案)。 假设我想添加仅允许某些用户访问的自定义属性: 案例#1 我见过这种重写 OnAuthorization 的方法,如果出现问题,它会
我有一个包含 2 个 fragment 的 Activity 。我决定使用 PageAdapter 在两个 View 之间滑动,但是,为了接近 android 设计最佳实践,我还决定使用操作栏选项卡(
有人可以向我解释一下 python 在 ubuntu 9.04 中发生了什么吗? 我正在尝试启动 virtualenv,而 --no-site-packages 标志似乎对 ubuntu 没有任何作用
我是一名优秀的程序员,十分优秀!