- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在学习了很多基础教程之后,我将尝试通过顶点或片段着色器实现 OpenGL 光照。问题是,根据相机视角,背景中有一个形状,而结果不取决于我是在顶点还是在片段中:
根据视角,它看起来有点像前方的空中飞人,而在右侧,如果几乎看不到它,它只会显示出被照亮的表面(不知何故让我想起了一个截锥体)。
现在我对点光源的理解是,与聚光灯不同,它可以照亮任何方向的所有东西,并且不应该也依赖于相机。
我目前主要在学习本教程:http://en.wikibooks.org/wiki/GLSL_Programming/GLUT/Diffuse_Reflection或 http://en.wikibooks.org/wiki/GLSL_Programming/GLUT/Smooth_Specular_Highlights而现在这是第二个。
请不要怀疑我现在将几乎所有的东西都传递给片段,这只是为了试验它,如前所述,如果不将任何东西传递给片段着色器,除了漫反射颜色并在像第一个教程中那样的顶点。另请注意,我还添加了一个纹理,它似乎可以很好地处理坐标。 Light position目前在worldspace,但也试过在eye space。我在 C++ 中使用 GLM 对矩阵进行的大部分数学运算,并且只将其传递过来。
FLOAT ViewMatrix[16] =
{
1.f, 0.f, 0.f, 0.f,
0.f, -1.f, 0.f, 0.f,
0.f, 0.f, -1.f, 0.f,
0.f, 0.f, 0.f, 1.f
};
viewMat = glm::make_mat4(ViewMatrix);
// Identity
modelMat = glm::mat4(1.0f);
//gl_NormalMatrix ?
modelviewMat=modelMat*viewMat;
m_3x3_inv_transp = glm::inverseTranspose(glm::mat3(modelviewMat));
//viewMat inverted
viewMatinv = glm::inverse(viewMat);
projMat = glm::frustum(-RProjZ, +RProjZ, -Aspect*RProjZ, +Aspect*RProjZ, 1.0f, 32768.0);
我当前的顶点着色器看起来像这样(目前没有任何环境光或镜面反射):
uniform sampler2D Texture0;
layout (location = 0) in vec3 v_coord; // == gl_Vertex
layout (location = 1) in vec3 v_normal;
uniform mat3 m_3x3_inv_transp; // == gl_NormalMatrix inverse transpose of modelviewMat
uniform mat4 projMat;
uniform mat4 viewMat;
uniform mat4 modelMat;
uniform mat4 modelviewMat;
uniform mat4 modelviewprojMat; // == gl_ModelViewProjectionMatrix == projMat*viewMat*modelMat;
uniform mat4 viewMatinv; // == ViewMatrix inverse
out vec2 vTexCoords;
out vec3 vv_coord;
out vec3 vv_normal;
out vec3 vNormalDirection;
out mat3 vm_3x3_inv_transp;
out mat4 vprojMat;
out mat4 vviewMat;
out mat4 vmodelMat;
out mat4 vmodelviewMat;
out mat4 vmodelviewprojMat;
out mat4 vviewMatinv;
void main(void)
{
//pass matrices also to fragment shader
vprojMat = projMat;
vviewMat = viewMat;
vmodelMat = modelMat;
vmodelviewMat = modelviewMat;
vmodelviewprojMat = modelviewprojMat;
vm_3x3_inv_transp = m_3x3_inv_transp;
vviewMatinv = viewMatinv;
vv_coord = v_coord;
vv_normal = v_normal;
//Texture UV to fragment
vTexCoords=TexCoords;
//Texture UV Lightmap to fragment
vLightTexCoords = LightTexCoords;
vNormalDirection = m_3x3_inv_transp * v_normal;
gl_Position = modelviewprojMat * vec4(v_coord, 1.0);
}
虽然片段着色器目前看起来像这样:
uniform sampler2D Texture0;
in vec2 vTexCoords;
in vec2 vLightTexCoords;
in vec3 vv_coord;
in vec3 vv_normal;
in vec3 vNormalDirection;
in mat3 vm_3x3_inv_transp;
in mat4 vprojMat;
in mat4 vviewMat;
in mat4 vmodelMat;
in mat4 vmodelviewMat;
in mat4 vmodelviewprojMat;
in mat4 vviewMatinv;
struct LightInfo
{
vec4 LightLocation;
vec3 DiffuseLightColor;
vec3 AmbientLightColor;
vec3 SpecularLightColor;
vec3 spotDirection;
float AmbientLightIntensity;
float SpecularLightIntensity;
float constantAttenuation;
float linearAttenuation;
float quadraticAttenuation;
float spotCutoff;
float spotExponent;
};
uniform LightInfo gLight;
struct material
{
vec4 diffuse;
};
material mymaterial = material(vec4(1.0, 0.8, 0.8, 1.0));
out vec4 FragColor;
void main (void)
{
vec4 color = texture2D(Texture0, vTexCoords);
vec3 normalDirection = normalize(vNormalDirection);
vec3 lightDirection;
float attenuation;
vec3 positionToLightSource;
if (gLight.LightLocation.w == 0.0) // directional light?
{
attenuation = 1.0; // no attenuation
lightDirection = normalize(vec3(gLight.LightLocation));
}
else // point light or spotlight (or other kind of light)
{
positionToLightSource = vec3(gLight.LightLocation - vec4(vv_coord,1.0));
}
vec3 diffuseReflection = vec3(gLight.DiffuseLightColor) * max(0.0, dot(normalDirection, lightDirection));
FragColor = color*vec4(diffuseReflection,1.0);
}
我目前还省略了衰减以简化它,但是有了衰减它也不起作用。将它设置为定向光,看起来左边的墙完全被照亮了,而且光的位置似乎是正确的,在球体上很明显。然而 positionToLightSource 似乎是罪魁祸首,但由于 LightLocation 是固定的,它必须是 vv_coord 并且我还尝试了任何可用矩阵的任何可以想象的转换版本,无论它是否有意义只是为了看看它的行为方式,因为我在这里阅读了一些问题将矢量作为颜色可以帮助调试,但我无法弄清楚。 vnormal 的 modelviewMat 的逆转置应该是什么样子的?但无论如何它似乎并不关心视角......
我的猜测是,并非所有东西都在同一个空间中(这很愚蠢,但我会感到惊讶,因为它用作定向光),或者出于某种原因 f.e. normalDirection/vnormals 是不对的 - 我不完全确定它,因为我从一个旧游戏引擎中获取值,它应该可以在某一天工作并且简单地遵循一些教程和示例代码它可以完美地工作。
现在做一个总结,这不仅仅是关于当前的问题,这里可能没有解决方案,因为它的来源可能超出了这些着色器的范围,尽管我仍然希望即使是这样也有人有想法,但也有如何正确调试这样的事情。我也尝试过 glsldevil,但没有经验,在没有任何 printf 或其他东西的情况下进行调试时,我仍然感到非常无助。将向量输出为颜色也很酷,但如前所述,我不知道什么是“应该看起来正确”——是否有某种“有效调试输出”的存档?请仅对 OpenGL3 或更新版本提出建议 :)
最佳答案
似乎是我获取法线信息的引擎需要先对屏幕坐标进行一些转换,所以绝对不是着色器的问题。在将 vv_coords 和 LightLocation 与 modMat 相乘后,将其放在正确的空间中,一切看起来都像预期的那样。尽管如此,如果 glsl 内部有一些这种“按颜色调试”的文件或文档,我仍然会感兴趣。无论如何谢谢 ;)
稍后编辑,对于任何寻找调试提示的人:http://antongerdelan.net/opengl/debugshaders.html
关于debugging - 形状取决于点光源顶点或片段着色器中的视角,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22485506/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!