Skip to content

Samplers in struct uniform  #11787

@markusjohnsson

Description

@markusjohnsson
Description of the problem

I have a shader that is using a struct with a sampler2D field. I've had to make a change in three.js to make it work. Perhaps the change should be included in three.js?

I'm getting this crash:

Uncaught TypeError: Cannot read property 'allocTextureUnit' of undefined
    at SingleUniform.setValueT1 [as setValue] (three.js:4505)
    at StructuredUniform.setValue (three.js:4697)
    at Function.WebGLUniforms.upload (three.js:4826)
    at setProgram (three.js:22170)
    at WebGLRenderer.renderBufferDirect (three.js:20964)
    at renderObject (three.js:21722)
    at renderObjects (three.js:21695)
    at WebGLRenderer.render (three.js:21463)
    at render (app.js:2758)
    at Object.execute (app.js:2760)

This is from build/three.js (0.86 from npm) (removed some whitespace):

	StructuredUniform.prototype.setValue = function ( gl, value ) {

		// Note: Don't need an extra 'renderer' parameter, since samplers
		// are not allowed in structured uniforms.

		var seq = this.seq;
		for ( var i = 0, n = seq.length; i !== n; ++ i ) {
			var u = seq[ i ];
			u.setValue( gl, value[ u.id ] );
		}
	};

If I do add renderer as parameter and pass it along to u.setValue, everything works as expected:

	StructuredUniform.prototype.setValue = function ( gl, value, renderer ) {

		var seq = this.seq;

		for ( var i = 0, n = seq.length; i !== n; ++ i ) {
			var u = seq[ i ];
			u.setValue( gl, value[ u.id ], renderer );
		}
	};

Now, about the comment. Is it true that samplers in structs are not allowed? Because it really does work after this change. Is there a difference between browsers, OSs or GPUs regarding this? My understanding after browsing around a bit, is that samplers in structs are allowed as long as the struct is a uniform. So I think three.js should allow this too.

Three.js version
  • Dev
  • r86
  • ...
Browser
  • All of them
  • Chrome
  • Firefox
  • Internet Explorer
OS
  • All of them
  • Windows
  • macOS
  • Linux
  • Android
  • iOS
Hardware Requirements (graphics card, VR Device, ...)

Radeon Pro 560 4096 MB

EDIT: spelling & grammar

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions