Articles of 着色器

使用GLSL着色器进行优化

我已经使用GLSL着色器编写了一个简单的OpenGL应用程序。 实际上,我的程序只是显示一个简单的多维数据集,具有如下的phong照明效果: 这是一个客户端代码的和平: pShaderProgram->BindAttribLocation(scene::VERTEX_POSITION, "VertexPosition"); pShaderProgram->BindAttribLocation(scene::VERTEX_TEXTURE, "VertexTexture"); pShaderProgram->BindAttribLocation(scene::VERTEX_NORMAL, "VertexNormal"); glm::mat3 normalMatrix = glm::mat3(glm::vec3(pMeshSceneNode->GetModelViewMatrix()[0]), glm::vec3(pMeshSceneNode->GetModelViewMatrix()[1]), glm::vec3(pMeshSceneNode->GetModelViewMatrix()[2])); pShaderProgram->SetUniform("ModelViewProjMatrix", pMeshSceneNode->GetModelViewProjectionMatrix()); pShaderProgram->SetUniform("ModelViewMatrix", pMeshSceneNode->GetModelViewMatrix()); pShaderProgram->SetUniform("NormalMatrix", normalMatrix); pShaderProgram->SetUniform("LightCount", (int)this->m_LightSceneNodeList.size()); pShaderProgram->SetUniform("colorMapSampler", 0); glm::mat4 viewMatrix = this->m_pCameraSceneNode->GetViewMatrix(); glm::vec4 lightPosition = viewMatrix * glm::vec4(this->m_LightSceneNodeList[0]->GetPosition(), 1.0f); glm::vec3 lightAmbient = this->m_LightSceneNodeList[0]->GetLightMaterial(scene::AMBIENT); glm::vec3 lightDiffuse = this->m_LightSceneNodeList[0]->GetLightMaterial(scene::DIFFUSE); glm::vec3 lightSpecular = this->m_LightSceneNodeList[0]->GetLightMaterial(scene::SPECULAR); pShaderProgram->SetUniform("LightInfos[0].Position", lightPosition); pShaderProgram->SetUniform("LightInfos[0].La", lightAmbient); pShaderProgram->SetUniform("LightInfos[0].Ld", lightDiffuse); pShaderProgram->SetUniform("LightInfos[0].Ls", […]

在几何着色器中计算每个顶点的法线

我能够在我的几何着色器中计算每个面的法线,但是我想为每个顶点法线计算平滑着色。 我的几何着色器是 #version 430 core layout ( triangles ) in; layout ( triangle_strip, max_vertices = 3 ) out; out vec3 normal_out; uniform mat4 projectionMatrix; uniform mat4 viewMatrix; uniform mat4 modelTranslationMatrix; uniform mat4 modelRotationXMatrix; uniform mat4 modelRotationYMatrix; uniform mat4 modelRotationZMatrix; uniform mat4 modelScaleMatrix; void main(void) { // Please ignore my modelMatrix and NormalMatrix calculation here mat4 […]

我的镜面阴影有什么问题

我很抱歉,如果这应该放在stackoverflow,而不是看到,因为这是graphics相关,我希望你们可以帮我:我正在试图写一个phong着色器,目前正在研究镜面reflection。 我来到以下公式: base*pow(dot(V,R),shininess)并尝试实现它(V是观察者的位置,R是reflection向量)。 这给了以下结果和代码: Vec3Df phongSpecular(const Vec3Df & vertexPos, Vec3Df & normal, const Vec3Df & lightPos, const Vec3Df & cameraPos, unsigned int index) { Vec3Df relativeLightPos=(lightPos-vertexPos); relativeLightPos.normalize(); Vec3Df relativeCameraPos= (cameraPos-vertexPos); relativeCameraPos.normalize(); int DotOfNormalAndLight = Vec3Df::dotProduct(normal,relativeLightPos); Vec3Df reflective =(relativeLightPos-(2*DotOfNormalAndLight*normal))*-1; reflective.normalize(); float phongyness= Vec3Df::dotProduct(reflective,relativeCameraPos); if (phongyness<0){ phongyness=0; } float shininess= Shininess[index]; float speculair = powf(phongyness,shininess); return Ks[index]*speculair; […]

什么是mental ray着色器,我可以在我自己的游戏中使用它们吗?

我正在使用FBX SDK在我的OpenGL应用程序中导入和显示FBX模型。 到目前为止,它使用简单的phong着色器工作良好,并显示基本模型。 不过,我有一些FBX模型具有自定义(Mental Ray)Arch&Design材质。 我能否在我的应用程序中使用这些材质渲染这些模型? 我的(完全小白)理解这是如何工作的,Arch&Design是一个着色器。 一个graphicsdevise师编辑了一些数据字段,模型渲染的方式是这样的数据在渲染过程中传递给Arch&Design着色器,着色器负责处理它(即完成所有的光照计算等)。 是否有可能在我的应用程序中使用华丽的Arch&Design着色器,所以我手动parsingFBX模型并将数据字段发送到着色器? 我如何获得它? 任何澄清将不胜感激,你可能会说,我有点困惑。

我们从顶点着色器传递给像素着色器的坐标是什么?

我已经阅读了关于着色器编程的文章,并了解了着色器编程的基本知识。 我总是感到困惑的一件事是关于纹理映射。 我从VS传递(输出)到PS是顶点位置和纹理坐标。 我明白,在VS中,我们可以简单地select传递顶点位置,或者在这里操作顶点位置(可能更多)。 所以我们最终通过的是vetex的位置。 但是…我还不清楚,我们正在通过的纹理坐标或紫外线? 如果我理解正确,如果我的模型是由3个顶点组成的简单三角形,VS将为每个顶点运行三次,并且我正在传递顶点的位置。 它直线前进。 但是纹理是什么? 说,我使用50×50 JPG图像作为纹理。 3个顶点如何映射到这个50×50像素的纹理? 从前几天我开始阅读的书中解释说,光栅化器是将顶点分组以形成三角形并计算三角形中的像素数的那个。 但是,对于我来说,我们还不清楚,我们作为纹理坐标传递给VS?

任意UV坐标的3D位置

我有一个3D网格的UV贴图,它编码UV坐标对之间的“链接”。 我之前已经定义了这个链接(或对),一对一。 使用函数rgb_color(u1, v1) = (u2, v2, 0.0) v2,0.0)来链接链接。 因此,在片段着色器中,给定当前片段的UV坐标,可以得到与当前片段“连接”的片段的UV坐标。 我想要做的就是在3D空间中绘制这个链接(即在当前片段与纹理坐标(u1, v1)及其“链接”纹理坐标(u2,v2)之间绘制一条线。就我所知是一个难以解决的问题,因为在片段着色器中,您无法访问3D坐标(u2,v2) 。 编辑:请注意,UV贴图是分段的,因此您不能在UV域中绘制这些线条。 你有什么想法如何解决这个问题?

如何在整个屏幕上运行着色器而不干扰其他正在运行的程序?

我想避免连接到DirectX,只需在整个屏幕上运行着色器。 这是我可以在Windows中做的事情,而不消耗不合理的资源量? 我可以使用任何语言或工具最实用的,但我最熟悉Java和HLSL。

什么是.fxo和.cod文件?

我一直在阅读着色器和看代码。 我在我看到的代码中发现了这个,它显然在那里有“Basic.fxo”。 BasicFX = new BasicEffect(device, L"FX/Basic.fxo"); 现在我的问题是该文件是什么? 我查看文件夹中有Basic.fx,Basic.fxo和Basic.cod。 我熟悉Basic.fx这是着色器? 所以我拿出.fxo和.cod重新执行程序,它只是重新生成文件? 什么是.cod / .fxo文件? 他们来自哪里? 他们在做什么?

标准化均匀的3d点

正如我在几何中看到的腐败一样,为什么规范一个齐次(除以w)顶点着色器返回的顶点位置是一个坏主意? 更新 顶点着色器: // float4 pos : SV_POSITION; output.pos = mul( mvpMatrix, float4(input.pos, 1) ); output.pos /= output.pos.w; // this line causes the visual corruption below 当我移动到线框的球体右侧时,有三个图像。 随着我越来越近,几何graphics开始腐蚀。 看来相机周围的几何graphics最腐败。

Unity着色器:处理数据结构的最好方法

我正在Unity着色器中使用二叉树存储一些预先计算的值,这个二叉树应该可用于着色器,并且理想情况下也将在graphics卡上构建(该树中的每个节点基于1个像素)有没有这样做的好方法?