- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这也是来自 thebennybox 的 youtube 3D 游戏引擎系列(如果你今天找到我以前的帖子),我很难找到这个 addUniform 方法中的问题。该位置始终是 0xFFFFFFFF 或 -1,抛出我定义的错误“找不到统一变量“uniformFloat””
我的顶点着色器:
#version 330
layout (location = 0) in vec3 position;
out vec4 colour;
uniform float uniformFloat;
void main()
{
colour = vec4(clamp(position, 0.0, uniformFloat), 1.0);
gl_Position = vec4(position, 1.0);
}
我的着色器类:
package com.base.engine;
import static org.lwjgl.opengl.GL20.*;
import static org.lwjgl.opengl.GL32.*;
import java.util.HashMap;
public class Shader {
private int program;
private HashMap<String, Integer> uniforms;
public Shader() {
program = glCreateProgram();
uniforms = new HashMap<String, Integer>();
if (program == 0) {
System.err.println("Shader Creation failed: could not find valid memory location in constructor");
System.exit(1);
}
}
public void bind(){
glUseProgram(program);
}
public void addUniform(String uniform){
int uniformLocation = glGetUniformLocation(program, uniform);
if (uniformLocation == 0xFFFFFFFF){
System.err.println("Error: could not find uniform variable \"" + uniform + "\"");
new Exception().printStackTrace();
System.exit(1);
}
uniforms.put(uniform, uniformLocation);
}
public void addVertexShader(String text) {
addProgram(text, GL_VERTEX_SHADER);
}
public void addGeometryShader(String text) {
addProgram(text, GL_GEOMETRY_SHADER);
}
public void addFragmentShader(String text) {
addProgram(text, GL_FRAGMENT_SHADER);
}
public void compileShader() {
glLinkProgram(program);
if (glGetProgrami(program, GL_LINK_STATUS) == 0) {
System.err.println(glGetShaderInfoLog(program, 1024));
System.exit(1);
}
glValidateProgram(program);
if(glGetProgrami(program, GL_VALIDATE_STATUS) == 0){
System.err.println(glGetShaderInfoLog(program, 1024));
System.exit(1);
}
}
private void addProgram(String text, int type) {
int shader = glCreateShader(type);
if (shader == 0) {
System.err.println("Shader creation failed: could not find valid memory location when adding shader");
System.exit(1);
}
glShaderSource(shader, text);
glCompileShader(shader);
if (glGetShaderi(shader, GL_COMPILE_STATUS) == 0) {
System.err.println(glGetShaderInfoLog(shader, 1024));
System.exit(1);
}
glAttachShader(program, shader);
}
public void setUniformi(String uniformName, int value){
glUniform1i(uniforms.get(uniformName), value);
}
public void setUniformf(String uniformName, float value){
glUniform1f(uniforms.get(uniformName), value);
}
public void setUniform(String uniformName, Vector3f value){
glUniform3f(uniforms.get(uniformName), value.getX(), value.getY(), value.getZ());
}
public void setUniform(String uniformName, Matrix4f value){
glUniformMatrix4(uniforms.get(uniformName), true, Util.createFlippedBuffer(value));
}
}
以及我对统一变量 Game 类的实现:
请特别注意 shader.addUniform 行和 update() 方法。
package com.base.engine;
import org.lwjgl.input.Keyboard;
public class Game {
private Mesh mesh;
private Shader shader;
public Game() {
mesh = new Mesh();
shader = new Shader();
Vertex[] data = new Vertex[] {new Vertex(new Vector3f(-1, -1, 0)),
new Vertex(new Vector3f(0, 1, 0)),
new Vertex(new Vector3f(1, -1, 0))};
mesh.addVertices(data);
shader.addVertexShader(ResourceLoader.loadShader("basicVertex.vs"));
shader.addFragmentShader(ResourceLoader.loadShader("basicFragment.fs"));
shader.compileShader();
shader.addUniform("uniformFloat");
}
public void input() {
if (Input.getKeyDown(Keyboard.KEY_UP)) {
System.out.println("We've just pressed up");
}
if (Input.getKeyUp(Keyboard.KEY_UP)) {
System.out.println("We've just released up");
}
if (Input.getMouseDown(1)) {
System.out.println("We've just pressed right-mouse at "
+ Input.getMousePosition().toString());
}
if (Input.getMouseUp(1)) {
System.out.println("We've just released right-mouse");
}
}
float temp = 0.0f;
public void update() {
temp += Time.getDelta();
shader.setUniformf("uniformFloat", (float)Math.sin(temp));
}
public void render() {
shader.bind();
mesh.draw();
}
}
抱歉,任何阅读者都必须费力地阅读这段代码,但我已经盯着这些代码看了一段时间了。我读到过当您没有使用统一变量但我的着色器正在使用它时可能会发生这种情况,对吗?
最佳答案
您的 uniform 不会以任何方式影响着色器的结果,因此很可能会被完全移除。只有现役 uniform 才有位置。一切正常。
关于java - 令人沮丧的统一变量不会加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19458379/
我迷路了。什么目的?把一个字符串变成一个整数?或者将字符转换为 ASCII?如果我为 char s[] 使用任何数字,我会返回该数字。如果我使用任何字母,我都会得到 0。此输出是否正确?如何测试返回类
我知道沮丧可能不是实现我愿望的最佳方式,但它至少表明了我脑海中闪过的解决方案。欢迎任何替代建议。 好吧,不妨深入研究我的代码: public void triggerItem(Item item) {
我有一个 RE 检查器说这应该可以工作。我做错了什么?!? 我试图忽略的示例: apps/cms/templates/cms/test_bup_DEPRECATED/widgets/page_link
全部, 我一定是做错了。当时这似乎是个好主意,但随着我深入研究,我认为有一种更合适的编程方式来实现它。所以我问你... 一张纸条。我正在使用 Google AppEngine 和数据存储来存储此信息。
与此错误消息的其他示例不同,我已经有一个指向 A 的指针并且想要检索实际的子类。 这种安排是一些 C++ 包装的 C 代码的一部分 A 是一些 POD C 结构(whatswhy 没有动态转换)而 t
我的图标字体有一些 CSS 问题,只是不想与 IE11 合作。昨天我花了几个小时试图掌握它,除了巨大的挫败感之外什么也没做。想过今天多花点时间,但 children 在家度假,我今天已经受够了 LOL
我正在尝试使用 dojo.dnd 拖动一个对象,但希望头像与对象处于相同的位置(相对于鼠标) 即如果有人在对象的中间单击,则鼠标光标将位于头像的中间。 我得到了各种奇怪的结果。如果我将一个函数连接到
所以我整天都在为此工作,我快要失去理智了。我正在尝试从谷歌的位置 api 获取坐标,以便从另一个 api (forcast.io) 获取天气。我的代码已经达到这样的程度,即 google api 正在
我在 Xcode 中出现一个错误,提示“Downcast from '[PFObject]?'” '[PFObject]' 只解包可选值;您是要使用“!”吗? var iDArray = [S
我想针对以下问题提出一些建议:假设您要为 VCL 控件编写适配器。所有适配器应具有相同的基类,但在包装特殊控件方面有所不同(例如,从 TEdit 获取值与从 TSpinEdit 获取值不同)。所以第一
我是一名优秀的程序员,十分优秀!