草庐IT

c++ - 在OpenGL/GLSL 4.3中读取和更新纹理缓冲区

我对此有点发疯,因为我并没有真正弄清楚什么是错误的,什么不是错误的。一定是我被严重误解的东西,或者代码或驱动程序中存在某种错误。截至上周,我正在AMDRadeon5850上使用最新的催化剂beta驱动程序运行此程序。好的,我开始进行OIT渲染实现,并希望使用保存在着色器存储缓冲区对象中的结构数组。好吧,其中的索引在内存方式上反射(reflect)/向前移动是错误的,我几乎认为这是一个驱动程序错误-因为它们是最近才开始支持这种东西+是的,它是一个beta驱动程序。因此,我向后移了一个凹口,改用了纹理缓冲对象中的glsl-images,我想至少从一开始就得到了支持。仍然表现不正确。因此,我

c++ - GLSL NVidia 方形工件

当GLSL着色器在以下GPU上生成不正确的图像时,我遇到了一个问题:GT430GT770GTX570GTX760但在这些上正常工作:英特尔核芯显卡2500英特尔高清4000英特尔4400GTX740MRadeonHD6310MRadeon高清8850Shader代码如下:boolPointProjectionInsideTriangle(vec3p1,vec3p2,vec3p3,vec3point){vec3n=cross((p2-p1),(p3-p1));vec3n1=cross((p2-p1),n);vec3n2=cross((p3-p2),n);vec3n3=cross((p1-

c++ - Phong 着色器中不需要的透明度 - GLSL

我正在尝试创建一个基本的Phong照明着色器以了解着色器中的照明。另外,我正在使用openframeworks。我创建了3个立方体,它们有一个围绕它们旋转的相机。照明似乎正常工作(有点),但立方体具有不需要的透明度,您可以在此处看到:这是我的代码,它基于thistutorial测试应用.h#pragmaonce#include"ofMain.h"classtestApp:publicofBaseApp{public:ofCameracamera;ofLightpointLight;floatcamAngle;floatcamX;floatcamY;floatcamZ;ofShaderl

c++ - OpenGL 阴影平移

我通过两次绘制过程为OpenGL中的场景添加阴影,一次绘制到深度图,一次绘制到普通帧缓冲区。在使用深度贴图的时候没有使用bias,有很多阴影粉刺。这是通过向深度图检查添加偏差来解决的。但是,当光线移动到不同的角度时,这会导致阴影与物体“分离”。我相信这种效果被称为彼得平移,是由于对不同角度使用了更大的偏差造成的。通常的解决方法似乎是在绘制阴影贴图时剔除背面的三角形,但是由于地板平面是2D对象,我认为这不会正常工作。我使用的实际地形是程序生成的,因此创建它的3D版本并不像这个简单示例中那么简单。如何才能将彼得平移固定在这样的2D对象上?顶点着色器#version400layout(loc

c++ - 如何更新 GLSL 中的统一变量

我试图从我的应用程序更新我的着色器中的眼睛位置,但是当我尝试这样做时,我一直收到错误1281。初始化后我没有问题,就在我随后尝试更新值时。这是我的代码:voidGraphicsObject::SendShadersDDS(charvertFile[],charfragFile[],字rune件名[]){char*vs=NULL,*fs=NULL;vert=glCreateShader(GL_VERTEX_SHADER);frag=glCreateShader(GL_FRAGMENT_SHADER);vs=textFileRead(vertFile);fs=textFileRead(fr

c++ - 确保 GLSL 兼容性

如何确保GLSL着色器与大多数现代显卡兼容?我有一个软件,我使用here中的GLSL代码.但是,即使我已将#version120添加到我的最终着色器的开头并确保它可以编译,但在某些用户计算机上,他们会遇到着色器编译错误(即使它们支持OpenGL3.2)。有什么工具可以用来“验证”或尝试使用不同的“着色器编译器”进行编译吗? 最佳答案 没有用于验证着色器的工具。即使有,它对您也没有用,因为如果不在您想要的硬件上运行,“有效”的着色器有什么用?你可以随心所欲地正确,但如果你的硬件拒绝它,即使你在技术上是正确的,你的着色器仍然不会运行。如

c++ - 变换反馈的完整设置(openGL)

GLSL1.50,openGL3.3。我最近一直在尝试让我的转换反馈发挥作用,但没有成功。在glBeginTranformFeedback()之后我仍然收到错误,并且由于我没有找到任何完整的工作代码,我已经用我发现的一些代码和文档积累了我的知识,它现在应该运行良好但我遗漏了一些东西。因此,如果有人有完整的代码(缓冲区的初始化、设置、更新、渲染、回读),那肯定会有所帮助,如果你不知道,但知道发生了什么,你可以看看我的代码。我排除了一些基准测试、Windows处理及其创建:intmain(){boolfullsize=false,paused=false;std::stringcaptio

c++ - 在着色器中同时在同一纹理单元中使用不同的纹理类型

当我尝试在我的着色器中对不同的纹理类型(即普通2D纹理和立方体贴图)使用相同的纹理单元(编号0)时,我在我的程序中遇到了一个棘手的问题。看起来GL在第一次glDrawArrays调用后发出502H(无效操作)。在我的应用程序代码中,我将纹理加载到不同的纹理目标:voidsetup_textures(){unsignedintwidth,height;intcomponents;unsignedintformat;floatparam[8];vectorpngData;GLenumtexture_target;glGenTextures(2,textures);glGetFloatv(G

c++ - 不使用激活的Attrib有影响吗?

切换到使用较少(或不同位置)属性的程序着色器时,是否应该禁用着色器属性?我使用glEnableVertexAttribArray()/glDisableVertexAttribArray()启用和禁用这些属性。是否会对性能产生任何影响,或者是否会带来一些错误,或者启用/禁用比激活所有属性并激活它们要慢? 最佳答案 OP最有可能已经理解了第一部分,但让我重申一下顶点属性的一些要点,为更有趣的部分设置基础。我将假设所有顶点数据都来自缓冲区,而不是讨论使用glVertexAttrib3f()这样的调用来为属性设置“常量”值的情况。glEn

c++ - GLSL 着色器纹理 alpha splatting

我正在尝试使用着色器加载地形上的四个纹理细节图block,方法是根据第五张图像合并它们,其中r、g、b和a组件用于确定每个纹理应该混合多少。混合工作正常,但是当我尝试添加我的“mixmap”图像时,它失败了,我猜是因为纹理坐标有问题。首先,这里是着色器:顶点着色器voidmain(){gl_TexCoord[0]=gl_MultiTexCoord0;gl_Position=ftransform();}片段着色器uniformsampler2DTexture0;uniformsampler2DTexture1;uniformsampler2DTexture2;uniformsampler