Articles of 几何着色器

手动编写dx11镶嵌细化着色器

我正在寻找手动实现镶嵌细分步骤的资源(我正好在使用Unity CG,但任何帮助表示赞赏)。 今天看来,把大部分的gpu代码隐藏起来,并且使用相当严格的简化(比如统一的SURFace着色器) ,这种风险显得非常激烈 。 除非你做了一些表面上的东西,否则这似乎毫无用处。 一点背景:我已经程序化地生成了具有质量法线但没有UV和没有切线的网格(使用步进立方体)。 我已经成功地写了一个自定义的顶点和片段着色器来做三面体纹理和凹凸贴图投影以及一些自定义的东西(自定义光照,程序上扭曲纹理的变化等)。 我正在使用GPUgem书作为参考。 现在我需要实现曲面细分,但是似乎我必须在曲面细分器获取它们之前 ( 在进行期间通过调整法线(ctrl + f在gems中: <normal.z, normal.y, -normal.x> ))计算运行时的切线某种types的每三角形几何传递,它在vert和frag之前)。 而且我还需要保留我自定义的vert + frag设置(用我自定义的参数/纹理在它们之间传递) – 显然我不能使用表面着色器。 任何人都可以提供一些指导?

纹理arrays和广告牌问题

这是我在这里的第一篇文章。 我叫布鲁诺,来自巴西。 我正在学习DirectX 11,而我正在使用Frank Luna的书。 问题是,他使用效果框架来做所有事情,而且我必须移植我所学的东西。 但现在,我被卡在广告牌课(几何着色器)。 另外,它似乎是一个质地问题,但我试着改变一切,但仍然无法find代码中出了什么问题。 我希望有人可以帮助我。 广告牌被画成完全黑色的四边形,好像没有纹理,或者全黑。 这是图像: 这是应该如何: HLSL代码是完整的,除了编号资源(寄存器b0,t0,s0等)外,我什么都没做。 这里是我的代码的2部分,我认为可能会被打破。 void TreeBillboard::CreateTextureArray() { vector<ComPtr<ID3D11Texture2D>> textures(4); HR(CreateDDSTextureFromFile(m_pDevice.Get(), L"../Direct3D11-Study/Textures/tree0.dds", reinterpret_cast<ID3D11Resource**>(textures[0].ReleaseAndGetAddressOf()), nullptr)); HR(CreateDDSTextureFromFile(m_pDevice.Get(), L"../Direct3D11-Study/Textures/tree1.dds", reinterpret_cast<ID3D11Resource**>(textures[1].ReleaseAndGetAddressOf()), nullptr)); HR(CreateDDSTextureFromFile(m_pDevice.Get(), L"../Direct3D11-Study/Textures/tree2.dds", reinterpret_cast<ID3D11Resource**>(textures[2].ReleaseAndGetAddressOf()), nullptr)); HR(CreateDDSTextureFromFile(m_pDevice.Get(), L"../Direct3D11-Study/Textures/tree3.dds", reinterpret_cast<ID3D11Resource**>(textures[3].ReleaseAndGetAddressOf()), nullptr)); // // Create the texture array. Each element in the texture // array has the same format/dimensions. // D3D11_TEXTURE2D_DESC texElementDesc; […]

需要帮助在数组中创建点

我正在使用hlsl创建一个闪电几何着色器,该着色器创建基于任意代数的点arrays。 我想完成的要点在这里: http : //drilian.com/2009/02/25/lightning-bolts/ 问题是伪代码使用一个dynamic数组,删除当前代线段,然后resize以添加新的线段。 我只能在hlsl中使用固定大小的数组。 我目前的代码如下: int generations = 4; int pointsarraysize = pow(2, generations) + 1; float3 points[pointsarraysize]; points[0] = startpoint; points[pointsarraysize – 1] = endpoint; for(int currentgeneration = 0; currentgeneration < genetations; ++currentgeneration) { for(int i = 0; i < pointsarraysize; ++i) { if (i == pow(2, currentgeneration)) { } } […]

一个顶点的统一几何graphics

Hy,我想用Unity中的geometryshader构建一些几何体。 我看了看这个 。 我想在3D空间(x,y,z)中的一个点上下文中创建我的几何graphics。 我可以以某种方式使用变换位置向量作为着色器的input值吗? 或者有什么像我可以使用的一个顶点网格? 我在Blender中试过这个 ,但是没有把那个Vertex网格导入到Unity中。 谢谢你的帮助!

统一几何着色器永久编译

我正在写一个着色器来实现一个激光表演效果的例子 。 现在我只关注线条。 一条线表示为一个三角形。 当我保存我的shadercode时,unity变得不活跃,我可以在任务管理器中看到着色器编译器有30%的cpu – >正在编译。 但是这需要永远,当我重新启动统一,它不能够从资产加载着色器。 我发现,当我评论这行时,不会发生这种情况: const int TRI_STRIP[TAM] = tmpTriStrip; 显然,我得到一个错误,TRI_STRIP是未定义的,但着色器编译器做了工作,Unity仍在运行。 然后我把代码放回到上面的desribed行为出现。 感谢您的任何提示和建议。 这里是完整的geometryshader代码: void myGeometryShader(point gIn vert[1], inout TriangleStream<v2f> triStream) { float f = _PointSize / 20.0f * sin(_Time * _Speed); //half size float4 vctmp[TAM]; int i; float y; for (i = 0; i < TAM; i += 3) { […]

OpenGL几何着色器二维矩形挤压有奇怪的角度

我有一个几何着色器,在2d(通过输出三角形条)将线条拉伸成矩形。 当线不平行于X或Y轴,我得到的是平行四边形。 另外,当线平行于X轴时,看起来更细。 以下是我的结果,从不同角度画出4条线: 这里是几何着色器: #version 150 core layout(lines) in; layout(triangle_strip, max_vertices = 4) out; in vec3 Color[]; smooth out vec3 FColor; void main() { vec3 g1 = gl_in[0].gl_Position.xyz; vec3 g2 = gl_in[1].gl_Position.xyz; vec3 v1 = normalize(g1 – g2) * 0.1; vec3 v2 = normalize(g2 – g1) * 0.1; FColor = Color[0]; gl_Position = vec4(-v2.y […]

一行中的顶点变换不同?

使用GL_LINE ,是否有办法使顶点(或几何)着色器以不同的方式处理第一个和第二个点? 即在从p0 – > p1的行中,我想对p0应用不同的转换,而不是p1 。 我知道如何用电脑着色器做到这一点,但我想知道是否有办法用顶点/几何着色器来做到这一点。

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

我能够在我的几何着色器中计算每个面的法线,但是我想为每个顶点法线计算平滑着色。 我的几何着色器是 #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 […]

什么是使用OpenGL绘制对象轮廓的最佳方式

我想select像对象一样绘制三维人体轮廓的最佳方法,以及为这种对象绘制轮廓的最佳方法是什么。 我发现基于模板缓冲区的方法,基于几何着色器的方法和基于香椿着色器的方法是一个,如果这是好的,如果是这样的方法。 还是有其他的最好的方法来画一个轮廓。

为什么设置几何着色器导致我的精灵消失?

我的应用程序有不同的任务的多个屏幕。 一旦我将几何着色器设置为自定义地形的设备上下文,它就能正常工作,并获得所需的结果。 但是当我回到主菜单时,所有的精灵和文字都消失了。 当我使用像素和顶点着色器时,这些精灵不会消失。 当然,精灵正在通过D3D11绘制,具有指定的视图和投影matrix以及input布局,顶点和像素着色器。 我正在尝试DeviceContext->ClearState()但它没有帮助。 有任何想法吗? void gGeometry::DrawIndexedWithCustomEffect(gVertexShader*vs,gPixelShader* ps,gGeometryShader* gs=nullptr) { unsigned int offset = 0; auto context = mp_D3D->mp_Context; //set topology context->IASetPrimitiveTopology(m_Topology); //set input layout context->IASetInputLayout(mp_inputLayout); //set vertex and index buffers context->IASetVertexBuffers(0,1,&mp_VertexBuffer->mp_Buffer,&m_VertexStride,&offset); context->IASetIndexBuffer(mp_IndexBuffer->mp_Buffer,mp_IndexBuffer->m_DXGIFormat,0); //send constant buffers to shaders context->VSSetConstantBuffers(0,vs->m_CBufferCount,vs->m_CRawBuffers.data()); context->PSSetConstantBuffers(0,ps->m_CBufferCount,ps->m_CRawBuffers.data()); if(gs!=nullptr) { context->GSSetConstantBuffers(0,gs->m_CBufferCount,gs->m_CRawBuffers.data()); context->GSSetShader(gs->mp_D3DGeomShader,0,0);//after this call all sprites disappear } //set shaders context->VSSetShader( […]