- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
只是尝试做一些基本的 webgl,其中我有两个“游戏对象”。一个简单的 Sprite 和一个矩形。基本上我想做的是绘制 Sprite 图像,然后绘制具有指定颜色的矩形。
两个对象都有一个 pos
向量以及宽度和高度。 Sprite 有一个图像对象,矩形有一个 rgb 值为 0 到 1 的颜色对象。
抱歉所有代码,但这是我的绘制方法:
draw: function () {
this.resize();
var delta = this.getDeltaTime();
gl.viewport(0, 0, gl.canvas.clientWidth, gl.canvas.clientHeight);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
var shaderProgram = this.shader.shaderProgram;
var matrixLocation = gl.getUniformLocation(shaderProgram, "uMatrix");
for (var i = 0; i < this.objects.length; i++) {
var planePositionBuffer = gl.createBuffer();
mat3.identity(this.mvMatrix);
gl.bindBuffer(gl.ARRAY_BUFFER, planePositionBuffer);
var object = this.objects[i];
var x1 = object.pos.x;
var y1 = object.pos.y;
var x2 = object.pos.x + object.width;
var y2 = object.pos.y + object.height;
var vertices = [
x1, y1,
x2, y1,
x1, y2,
x1, y2,
x2, y1,
x2, y2
];
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, 2, gl.FLOAT, false, 0, 0);
var textureBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, textureBuffer);
var textureCoords;
if (object.image) {
var dw = (object.width / object.image.image.width);
var dh = 1.0 - (object.height / object.image.image.height);
textureCoords = [
0.0, 1.0,
dw, 1.0,
0.0, dh,
0.0, dh,
dw, 1.0,
dw, dh
];
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, this.objects[i].image);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(textureCoords), gl.STATIC_DRAW);
gl.vertexAttribPointer(shaderProgram.textureCoordAttribute, 2, gl.FLOAT, false, 0, 0);
}
mat3.multiply(this.mvMatrix, this.mvMatrix, [
2 / gl.canvas.clientWidth, 0, 0,
0, -2 / gl.canvas.clientHeight, 0,
-1, 1, 1
]);
gl.uniformMatrix3fv(matrixLocation, false, this.mvMatrix);
gl.uniform1i(shaderProgram.samplerUniform, 0);
var colorLocation = gl.getUniformLocation(shaderProgram, "uColor");
if (object.color) {
var color = object.color;
gl.uniform4f(colorLocation, color.r, color.g, color.b, 1);
}
else {
gl.uniform4f(colorLocation, 1.0, 1.0, 1.0, 1);
}
gl.drawArrays(gl.TRIANGLE_STRIP, 0, 6);
}
requestAnimationFrame(this.draw.bind(this));
}
基本上我所做的就是将位置坐标放在一起,以便在哪里绘制图像/矩形。
然后我检查该对象是否有图像。如果是,则根据其 Sprite 宽度与图像尺寸计算纹理坐标。并绑定(bind)纹理。
下面,如果对象没有颜色,我将统一颜色设置为白色。如果该对象确实有颜色,则会根据该颜色设置制服。
现在,在我的列表中,图像 Sprite 是第一个,矩形是第二个,首先针对图像调用bindTexture。这会在绘图调用中保留下来。 OpenGL 是一个状态机,因此图像首先绘制,保持绑定(bind)状态,然后再次绘制矩形坐标。它只使用我在矩形中保存的绿色。
所以我在这里的主要问题是:是否有适当的方法来清除这个?或者有没有办法仅在某些情况下针对顶点绘制颜色,而在另一种情况下绘制纹理?
这是我的着色器:
<script id="shader-fs" type="x-shader/x-fragment">
precision mediump float;
varying vec2 vTextureCoord;
uniform sampler2D uSampler;
uniform vec4 uColor;
void main(void) {
gl_FragColor = texture2D(uSampler, vec2(vTextureCoord.s, vTextureCoord.t)) * uColor;
}
</script>
<script id="shader-vs" type="x-shader/x-vertex">
attribute vec2 aVertexPosition;
attribute vec2 aTextureCoord;
uniform mat3 uMatrix;
varying vec2 vTextureCoord;
void main() {
gl_Position = vec4((uMatrix * vec3(aVertexPosition, 1)).xy, 0, 1);
vTextureCoord = aTextureCoord;
}
</script>
非常简单。使用统一矩阵使我的代码中的屏幕坐标高于剪辑坐标。
最佳答案
使用单个着色器绘制纹理或颜色的典型方法是将不使用的着色器设置为白色并相乘或黑色并相加。我更喜欢白色和多重,这是你已经拥有的。
所以,当您只想使用纹理进行绘制时
var whiteColor = [1, 1, 1, 1];
gl.bindTexture(gl.TEXTURE_2D, textureWithImageInIt);
gl.uniform4fv(uColorLocation, whiteColor);
当您只想使用颜色绘制时,绑定(bind) 1x1 像素白色纹理
在初始化时
var white1PixelTexture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, white1PixelTexture);
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE,
new Uint8Array([255,255,255,255]));
绘制时
gl.bindTexture(gl.TEXTURE_2D, white1PixelTexture);
gl.uniform4fv(uColorLocation, someColor);
这是有效的,因为white = 1
和1 * Something = Something
所以texture * 1 =texture
,1 * color =颜色
;
它还可以让您对纹理进行着色以获得简单的效果。将颜色设置为红色[1, 0.4, 0.4, 1]
,您将获得纹理的红色版本。随着时间的推移调整 Alpha [1, 0, 0, lerpColorOverTime]
,您可以淡出纹理。
关于javascript - WebGL 将矩形和图像绘制到一个着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25900154/
我之前让 dll 注入(inject)器变得简单,但我有 Windows 7,我用 C# 和 C++ 做了它,它工作得很好!但是现在当我在 Windows 8 中尝试相同的代码时,它似乎没有以正确的方
我正在尝试制作一个名为 core-splitter 的元素,该元素在 1.0 中已弃用,因为它在我们的项目中起着关键作用。 如果您不知道 core-splitter 的作用,我可以提供一个简短的描述。
我有几个不同的蜘蛛,想一次运行所有它们。基于 this和 this ,我可以在同一个进程中运行多个蜘蛛。但是,我不知道如何设计一个信号系统来在所有蜘蛛都完成后停止 react 器。 我试过了: cra
有没有办法在达到特定条件时停止扭曲 react 器。例如,如果一个变量被设置为某个值,那么 react 器应该停止吗? 最佳答案 理想情况下,您不会将变量设置为一个值并停止 react 器,而是调用
https://code.angularjs.org/1.0.0rc9/angular-1.0.0rc9.js 上面的链接定义了外部js文件,我不知道Angular-1.0.0rc9.js的注入(in
我正在尝试运行一个函数并将服务注入(inject)其中。我认为这可以使用 $injector 轻松完成.所以我尝试了以下(简化示例): angular.injector().invoke( [ "$q
在 google Guice 中,我可以使用函数 createInjector 创建基于多个模块的注入(inject)器。 因为我使用 GWT.create 在 GoogleGin 中实例化注入(in
我在 ASP.NET Core 1.1 解决方案中使用配置绑定(bind)。基本上,我在“ConfigureServices Startup”部分中有一些用于绑定(bind)的简单代码,如下所示: s
我在 Spring MVC 中设置 initBinder 时遇到一些问题。我有一个 ModelAttribute,它有一个有时会显示的字段。 public class Model { privat
我正在尝试通过jquery post发布knockoutjs View 模型 var $form = $('#barcodeTemplate form'); var data = ko.toJS(vm
如何为包含多态对象集合的复杂模型编写自定义模型绑定(bind)程序? 我有下一个模型结构: public class CustomAttributeValueViewModel { publi
您好,我正在尝试实现我在 this article 中找到的扩展方法对于简单的注入(inject)器,因为它不支持开箱即用的特定构造函数的注册。 根据这篇文章,我需要用一个假的委托(delegate)
你好,我想自动注册我的依赖项。 我现在拥有的是: public interface IRepository where T : class public interface IFolderReposi
我正在使用 Jasmine 测试一些 Angular.js 代码。为此,我需要一个 Angular 注入(inject)器: var injector = angular.injector(['ng'
我正在使用 Matlab 代码生成器。不可能包含代码风格指南。这就是为什么我正在寻找一个工具来“ reshape ”、重命名和重新格式化生成的代码,根据我的: 功能横幅约定 文件横幅约定 命名约定 等
这个问题在这里已经有了答案: Where and why do I have to put the "template" and "typename" keywords? (8 个答案) 关闭 8
我开发了一种工具,可以更改某些程序的外观。为此,我需要在某些进程中注入(inject)一个 dll。 现在我基本上使用这个 approach .问题通常是人们无法注入(inject) dll,因为他们
我想使用 swing、spring 和 hibernate 编写一个 java 应用程序。 我想使用数据绑定(bind)器用 bean 的值填充 gui,并且我还希望它反射(reflect) gui
我有这段代码,当两个蜘蛛完成后,程序仍在运行。 #!C:\Python27\python.exe from twisted.internet import reactor from scrapy.cr
要点是 Spring Batch (v2) 测试框架具有带有 @Autowired 注释的 JobLauncherTestUtils.setJob。我们的测试套件有多个 Job 类提供者。因为这个类不
我是一名优秀的程序员,十分优秀!