- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试最小化和简化本教程中的代码:
https://github.com/mattdesl/lwjgl-basics/wiki/ShaderLesson6
虽然这是一个非常好的教程,但代码示例过于复杂。我设法将简单的 vec3 和 vec4 传递给 GLSL,现在我想传递纹理和纹理法线以在颜色计算中使用它们的信息。
这是我的代码:
正在加载纹理...
//textures
private Texture rock;
private Texture rockNormals;
rock = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("src/main/rock.png"));
rockNormals = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("src/main/rock_n.png"));
在“start”方法中...
//Diffuse Texture
int diffLoc = glGetUniformLocation(shaderProgram, "u_texture");
glUniform1i(diffLoc, GL_TEXTURE0);
//Normals Image
int normalsLoc = glGetUniformLocation(shaderProgram, "u_normals");
glUniform1i(normalsLoc, GL_TEXTURE1);
在“渲染”方法中...
private void render()
{
//activate shader and update variable uniforms
glUseProgram(shaderProgram);
//Light Position
lightPos.x = Mouse.getX() / (float) Display.getWidth();
lightPos.y = Mouse.getY() / (float) Display.getHeight();
int lightPosLoc = glGetUniformLocation(shaderProgram, "LightPos");
glUniform3f(lightPosLoc, lightPos.x, lightPos.y, lightPos.z);
//bind diffuse color to texture unit 0
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, rock.getTextureID());
//bind normal map tp texture unit 1
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, rockNormals.getTextureID());
glBegin(GL_QUADS);
glVertex2f(-0.5f, -0.5f);
glVertex2f(0.5f, -0.5f);
glVertex2f(0.5f, 0.5f);
glVertex2f(-0.5f, 0.5f);
glEnd();
glUseProgram(0);
}
虽然我的目标是能够从着色器内将纹理应用到四边形,但这就是我的控制台中显示的内容:
Fri Mar 14 22:38:55 GMT 2014 INFO:Use Java PNG Loader = true
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000000cf36210, pid=9160, tid=600
#
# JRE version: 7.0_25-b17
# Java VM: Java HotSpot(TM) 64-Bit Server VM (23.25-b01 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C [ig75icd64.dll+0x116210] RegisterProcTableCallback+0x10cac0
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:\Users\Hugo\Desktop\Domus\Programação\Java\workspace\LwjglShaders\hs_err_pid9160.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
奇怪的是,如果我将“GL_TEXTURE0”更改为“0”并将“GL_TEXTURE1”更改为“1”,四边形会出现非常奇怪且嘈杂的纹理(当我说嘈杂时,我的字面意思是动态噪声正在发生) 。这是图片:
我不知道图像是否有什么关系,可能它甚至不应该使用 0 和 1 作为输入,所以结果是不可预测的,这是可以理解的。不过,我不知道为什么第一个代码不起作用。
这也是来自着色器的代码(有一些未使用的制服,因为在实际进行数学计算之前我仍在调试传递的信息)
.frag
//attributes from vertex shader
varying vec4 vColor;
varying vec2 vTexCoord;
//our texture samplers
uniform sampler2D u_texture; //diffuse map
uniform sampler2D u_normals; //normal map
//values used for shading algorithm...
uniform vec2 Resolution; //resolution of screen
uniform vec3 LightPos; //light position, normalized
uniform vec4 LightColor; //light RGBA -- alpha is intensity
uniform vec4 AmbientColor; //ambient RGBA -- alpha is intensity
uniform vec3 Falloff; //attenuation coefficients
void main() {
gl_FragColor = texture2D(u_texture, gl_TexCoord[0].st);
}
.vert
//combined projection and view matrix
uniform mat4 u_projView;
//"in" attributes from our SpriteBatch
attribute vec2 Position;
attribute vec2 TexCoord;
attribute vec4 Color;
//"out" varyings to our fragment shader
varying vec4 vColor;
varying vec2 vTexCoord;
void main() {
vColor = Color;
vTexCoord = TexCoord;
//gl_Position = u_projView * vec4(Position, 0.0, 1.0);
gl_Position = ftransform();
}
这可能是一些愚蠢的事情,但我对着色器很陌生,所以请忍受我的无知:)
最佳答案
使用0
和1
作为采样器制服来引用GL_TEXTURE0
和GL_TEXTURE1
实际上是正确的方式。
我可以在您的着色器中看到至少一个额外的错误,这可能可以解释您的结果:
gl_FragColor = texture2D(u_texture, gl_TexCoord[0].st);
您在这里使用gl_TexCoord[0]
。这是一个已弃用的内置变量。你一开始就不应该使用它。然而,它被弃用的事实并不是这里的主要问题,而是它的值是未定义的事实,因为您从未在顶点着色器中写入它。实际上,您已经在两个着色器中声明了不同的 vTexCoord
,甚至还向其中写入了纹理坐标,但您只是不使用它。您只需将 FS 中的该行更改为:
gl_FragColor = texture2D(u_texture, vTexCoord);
顺便说一句:你为什么使用这个相当旧的 GLSL 版本?您是否因某种原因受限于 GL2.0、GLES2.0 或 webgl?您应该知道还有更多现代版本。而且您应该避免使用像 ftransform
这样的已弃用的东西,顺便说一句。内部使用 gl_Vertex
内置属性(它可能与您的 Position
属性相同,也可能不同,这取决于您的属性设置)。一般来说,如果没有看到如何设置/查询属性位置以及如何指定顶点数组指针的代码,就很难判断着色器中是否会出现正确的值以及我建议的修复是否足够。
关于java - 将 LWJGL 纹理传递到 GLSL 着色器时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22417140/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!