我正在尝试在 GLSL 中绘制一些深度图之王,为此我至少需要一个 10 位通道。我决定使用 GL_R16 或 GL_RGBA12 - 它们是最接近的,并且 GL_R16 将花费更少的 GPU 内存(因为它会......对吧?)。
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA12, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
Run Code Online (Sandbox Code Playgroud)
问题来了:如何让 GLSL 正确使用它?Sampler2D 将其转换为经典的 8 位 RGBA...钳位怎么样?在 GLSL 中,每个分量颜色都归一化为 [0,1] - 16 位是否相同?我只想知道如何使用它。
我对 OpenGL 完全陌生,无法弄清楚将纹理和着色器绑定到 VBO 的工作原理。
我正在使用 Cinder 的纹理和着色器类。这是我的绘制方法的一部分:
mShader.bind();
myImage.bind();
glPushMatrix();
glTranslated( scaledX, scaledY, scaledZ);
gl::draw(sphere.getVBO());
glPopMatrix();
glPushMatrix();
glTranslated( 0, 0, zshift - 200);
mDisc.draw();
glPopMatrix();
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,如果我注释掉对 mShader.bind() 的调用,我的球体 VBO 将显示纹理 (myImage)。我的着色器对于普通(无纹理)形状效果很好,但是当我在绘制任何带有包裹纹理的形状之前绑定着色器时,它会阻止纹理的显示。
这是我使用的着色器的问题,还是我不理解的其他问题?(……还有很多不明白的地方)
谢谢
编辑:
这是我正在使用的着色器:
(片段):
uniform sampler2DShadow depthTexture;
varying vec3 N, V, L;
varying vec4 q;
void main(void)
{
vec3 normal = normalize( N );
vec3 R = -normalize( reflect( L, normal ) );
vec4 ambient = gl_FrontLightProduct[0].ambient;
vec4 diffuse = gl_FrontLightProduct[0].diffuse * max(dot( normal, L), 0.0);
vec4 …Run Code Online (Sandbox Code Playgroud) 每个顶点数组对象是否必须上传一次着色器制服(例如不经常更改的投影矩阵)?或者绑定变量与活动的VAO无关,着色器在绘制时只与顶点对象连接?
(例如,在通过绘制命令将顶点数据发送给着色器之前,着色器是否代表自己,或者是否以某种方式绑定到创建的 vao?)
我正在学习OpenGL,我试图绘制一个红色三角形,但我的三角形保持黑色.
这是我的片段着色器的代码:
#version 330 core
out vec4 color;
void main()
{
color = vec4(1,0,0,1);
}
Run Code Online (Sandbox Code Playgroud)
我的着色器编译没有问题,我使用这个类来使用着色器:
public class ShaderProgram
{
private final int programId;
private int vertexShaderId;
private int fragmentShaderId;
public ShaderProgram() throws Exception
{
programId = glCreateProgram();
if (programId == 0) {
throw new Exception("Could not create Shader");
}
}
public void createVertexShader(String shaderCode) throws Exception {
vertexShaderId = createShader(shaderCode, GL_VERTEX_SHADER);
}
public void createFragmentShader(String shaderCode) throws Exception {
fragmentShaderId = createShader(shaderCode, GL_FRAGMENT_SHADER);
}
protected int createShader(String shaderCode, int …Run Code Online (Sandbox Code Playgroud) 作为参考,我正在遵循本教程。现在假设我有一个具有多种类型模型的小应用程序,如果我理解正确的话,我必须将每个模型的 MPV 矩阵从 CPU 发送到 GPU(换句话说,发送到我的顶点着色器),因为每个模型可能有不同的模型矩阵从一个到另一个。
现在看看教程和这篇文章,我明白应该为每个帧和每个模型调用将矩阵发送到我的着色器 ( glUniformMatrix4fv(myMatrixID, 1, GL_FALSE, &myModelMVP[0][0])) ,因为每次它都会覆盖我的 MVP 的先前值(我的最后一个值)模型)。但是,考虑到我的应用程序的性能,我不想通过总线发送无用的数据,如果我理解正确的话,我的模型矩阵对于每个模型都是恒定的。
我正在考虑为每个模型的 MVP 矩阵制定一个制服,但我认为它不可扩展,如果我的视图或投影矩阵发生变化,我还必须更新所有这些......有没有办法避免多次发送我的模型矩阵并且仅在更改时发送我的视图和投影矩阵?
在 github 上找到了一个带有着色器的 Unity 软体资源。由于对Unity着色器的了解有限,我不知道上述错误是什么意思。
代码(第22行是发生错误的地方,我已经标记了。):
Shader "Custom/Circle" {
Properties {
_Color ("Color", Color) = (1, 1, 1, 1)
}
SubShader {
Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
Pass {
CGPROGRAM
#include "UnityCG.cginc"
#pragma vertex vert_img
#pragma fragment frag
#pragma target 3.0
float4 _Color;
float4 frag(v2f_img i): COLOR {
fixed4 transparent = float4(float3(_Color),0); // << ERROR IS HERE >>
float distance = length(i.uv - float2(0.5, 0.5));
float delta = fwidth(distance);
float alpha = smoothstep(0.5, 0.5 - delta, …Run Code Online (Sandbox Code Playgroud) 我有一个 2 阶段体积渲染器,我使用 DVR 方法来渲染体积,但深度缓冲区不适合该体积,因为我使用来自盒子的光线投射。
实际上我有一个盒子,我应该根据体积数据计算正确的深度值。
我在顶点着色器中有这个:
out float DEPTH ;
...
DEPTH = gl_Position.z / gl_Position.w;
Run Code Online (Sandbox Code Playgroud)
并在片段中:
gl_FragDepth = (1.0 - 0.0) * 0.5 * DEPTH + (1.0 + 0.0) * 0.5;
Run Code Online (Sandbox Code Playgroud)
它们非常适合盒子,我的主要问题是如何在深度上添加一点来获得正确的深度值?
我也用了 from (distanceToAdd/100 + DEPTH),但是是错误的。
任何想法?
我正在尝试编译一个着色器,它正在一台PC上的Intel HD上进行编译,而不是在另一台PC上的AMD驱动程序上进行编译.
顶点着色器:
#version 330
precision mediump float;
precision lowp sampler2D;
uniform mat4 ProjectionMatrix;
uniform mat4 ModelViewMatrix;
uniform mat4 WorldViewMatrix;
in vec3 position;
in vec2 TexCoord;
out vec2 texCoord;
void main() {
texCoord = TexCoord;
gl_Position = ProjectionMatrix * ModelViewMatrix * WorldViewMatrix * vec4(position, 1);
}
Run Code Online (Sandbox Code Playgroud)
片段着色器:
#version 330
precision mediump float;
precision lowp sampler2D;
uniform vec4 TextureHueColor;
uniform sampler2D TextureUnit;
in vec2 texCoord;
out vec4 gl_FragColor;
void main() {
gl_FragColor = texture(TextureUnit, texCoord) * TextureHueColor;
}
Run Code Online (Sandbox Code Playgroud)
在AMD驱动程序上,我得到:
Vertex shader …Run Code Online (Sandbox Code Playgroud) 返回的值是多少:
\n\ndot(normalize(a), normalize(b))\nRun Code Online (Sandbox Code Playgroud)\n\n假设向量 a 和 b 之间的角度为 45\xc2\xb0。
\n\n